繁体   English   中英

Sql命名最佳实践

[英]Sql naming best practice

我不完全确定行业中是否有标准或其他标准,所以我在这里问。

我正在命名一个Users表,我不完全确定如何命名成员。

user_id是一个显而易见的,但我想知道我是否应该使用“user_”前缀所有其他字段。

user_name user_age

或者只是姓名和年龄等......

这样的前缀毫无意义,除非你有一些更随意的东西; 像两个地址。 然后你可以使用address_1,address_2,address_home等

与电话号码相同。

但对于像年龄,性别,用户名等一样静态的东西; 我会这样离开他们。

只是为了向您展示如果您要为所有这些字段添加前缀,那么您的查询可能如下所示

SELECT users.user_id FROM users WHERE users.user_name = "Jim"

什么时候可以很容易

SELECT id FROM users WHERE username = "Jim"

我同意其他建议不要在表名前加上属性。

但是,我支持使用外键的匹配名称和它们引用的主键1的想法,为此,您通常必须在依赖表中为id属性添加前缀。

不太知名的东西是SQL支持使用USING关键字的简洁连接语法:

CREATE TABLE users (user_id int, first_name varchar(50), last_name varchar(50));
CREATE TABLE sales (sale_id int, purchase_date datetime, user_id int);

然后是以下查询:

SELECT s.*, u.last_name FROM sales s JOIN users u USING (user_id);

相当于更详细和流行的连接语法:

SELECT s.*, u.last_name FROM sales s JOIN users u ON (u.user_id = s.user_id);

1这并不总是可行的。 一个典型的例子是一个user_id在一个字段users表, reported_byassigned_to在引用表中的字段,这两个引用users表。 在这种情况下使用user_id字段既不明确,也不可能用于其中一个字段。

正如其他答案所暗示的那样,这是个人偏好 - 选择某些命名架构并坚持下去。
大约10年前,我使用Oracle Designer,它使用了我喜欢和使用的命名模式:

  • 表名是复数 - USERS
  • 代理主键被命名为表名的单数加'_id' - 表USERS的主键是“USER_ID”。 这样,当您在其他表中使用“USER_ID”字段作为外键时,您具有一致的命名
  • 列名没有表名作为前缀。

可选:

  • 在具有大量表的数据库中(根据需要解释为“大”),使用2-3个字符的表前缀,以便您可以在逻辑上划分区域中的表。 例如:包含销售数据(发票,发票项目,文章)的所有表都具有前缀“INV_”,所有包含人力资源数据的表都具有前缀“HR_”。 这样就可以更容易地查找和排序包含相关数据的表(这也可以通过将表放在不同的方案中并设置适当的访问权限来完成,但是当您需要在一台服务器上创建多个数据库时,它会变得复杂)

再次,选择您喜欢的命名模式并保持一致。

只要记下名字和年龄,当你想知道你正在使用什么样的名字时,表格应该提供必要的背景。

将其视为实体并相应地命名字段

我建议使用User表,其中包含id,name,age等字段。

一组记录是一组用户,但该组字段代表一个用户。

因此,您最终会引用user.iduser.nameuser.age (尽管您不会始终包含表名,具体取决于查询)。

对于表名,我通常使用复数名词(或名词短语),就像你一样。

对于列名,我不使用表名作为前缀。 表本身指定列的上下文。

表用户(复数):

  • ID
  • 名称
  • 年龄

干净利落。

这是个人喜好。 我们可以为您提供的最佳建议是一致性,易读性以及确保关系正确命名。

如果可能,请使用有意义且不缩写的名称,除非您使用的存储机制与它们不兼容。

在关系中,我喜欢在主键上使用Id,在外键上使用[table_name] _Id。 例如。 Order.Id和OrderItem.OrderId

如果使用代理键作为主键,则ID可以正常工作。

您的存储机制可能也可能不区分大小写,因此请务必考虑到这一点。

编辑:另外,thre是一些理论,建议表应该是该表中的单个记录应该表示的名称。 所以,表名“User”而不是“Users” - 个人复数对我来说更有意义,只要保持一致。

首先,我建议使用单数名词,即用户而不是用户 ,尽管这更多是个人偏好。

其次,有些人更喜欢始终命名主键列id ,而不是user_id (即表名+ id ),并且类似于name而不是employee_name 我认为这是一个坏主意,原因如下:

-- when every table has an "id" (or "name") column, you get duplicate column names in the output:
select e.id, e.name, d.id, d.name
from employee e, department d
where e.department_id = d.id

-- to avoid this, you need to specify column aliases every time you query:
select e.id employee_id, e.name employee_name, d.id department_id, d.name department_name
from employee e, department d
where e.department_id = d.id

-- if the column name includes the table, there are no conflicts, and the join condition is very clear
select e.employee_id, e.employee_name, d.department_id, d.department_name
from employee e, department d
where e.department_id = d.department_id

我不是说你应该在表中的每一列中包含表名,而是为key(id)列和其他可能包含的“泛型”列(如名称,描述,备注等)执行此操作。在查询中。

我使用与表相关的前缀明确命名了我的列

i.e. table = USERS, column name = user_id, user_name, user_address_street, etc.

在此之前,当我开始使用JOINS时,我不得不将列名称中的废话别名以避免查询结果中的冲突,然后当从MVC视图中的模板访问时,如果查询结果字段名称与发布的名称不匹配db模式,模板设计者会感到困惑,并且必须要求SQL VIEW来确定要使用的正确字段名称。

因此,在列名中使用前缀看起来很麻烦,但实际上它对我们来说效果更好。

我不完全确定这个行业是否有标准

是: ISO 11179-5:命名和识别原则 ,可在此处获得

我认为表名和列名必须是这样的。

表名:
用户 - >大写每个单词而不是复数。

列名:
Id - >如果我看到“Id”我明白这是PK专栏。
GroupId - >我理解有一个名为Group的表,这个列是Group表的关系列。
名称 - >如果在用户表中有一个名为“名称”的列,则表示用户名。 这很清楚。

特别是如果您正在使用实体框架,我想更多。

注意:抱歉我的英语不好。 如果有人会纠正我糟糕的英语,我会很高兴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM