[英]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_by
和assigned_to
在引用表中的字段,这两个引用users
表。 在这种情况下使用user_id
字段既不明确,也不可能用于其中一个字段。
正如其他答案所暗示的那样,这是个人偏好 - 选择某些命名架构并坚持下去。
大约10年前,我使用Oracle Designer,它使用了我喜欢和使用的命名模式:
可选:
再次,选择您喜欢的命名模式并保持一致。
只要记下名字和年龄,当你想知道你正在使用什么样的名字时,表格应该提供必要的背景。
将其视为实体并相应地命名字段
我建议使用User表,其中包含id,name,age等字段。
一组记录是一组用户,但该组字段代表一个用户。
因此,您最终会引用user.id
, user.name
, user.age
(尽管您不会始终包含表名,具体取决于查询)。
对于表名,我通常使用复数名词(或名词短语),就像你一样。
对于列名,我不使用表名作为前缀。 表本身指定列的上下文。
表用户(复数):
干净利落。
这是个人喜好。 我们可以为您提供的最佳建议是一致性,易读性以及确保关系正确命名。
如果可能,请使用有意义且不缩写的名称,除非您使用的存储机制与它们不兼容。
在关系中,我喜欢在主键上使用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.