[英]MySQL naming conventions, should field name include the table name?
一位朋友告诉我,我应该将表名包含在同一个表的字段名中,我想知道为什么? 它应该是这样吗? 例:
(Table) Users
(Fields) user_id, username, password, last_login_time
我看到前缀'user_'没有意义,因为我知道它已经是一个用户。 但我也想听听你的意见。 注意:我在php,mysql中编程。
我同意你的看法。 我唯一想把表名或缩写形式放在主键和外键上或者“自然”名称是关键字的地方。
Users: id or user_id, username, password, last_login_time
Post: id or post_id, user_id, post_date, content
我通常使用'id'作为主键字段名称,但在这种情况下我认为user_id和post_id也完全正常。 请注意,发布日期称为“post_date”,因为“date”是一个关键字。
至少这是我的惯例。 你的旅费可能会改变。
我认为没有理由包括表名,这是多余的。 在查询中,您可以将字段称为<table name>。<field name>(例如“user.id”)。
使用'id'和'name'等通用字段,最好将表名放入。
原因是在跨多个表编写连接时可能会造成混淆。
这是个人偏好,真的,但这背后的原因(我总是这样做)。
无论选择哪种方法,都要确保它在项目中是一致的。
我个人不在主表中添加字段名称的表名,但是当在另一个表中使用它作为外来字段时,我会在其前面添加源表的名称。 例如,users表上的id字段将被称为id,但在评论表上,评论链接到发布它们的用户,它将是user_id。
这是我从CakePHP的命名方案中获得的,我认为它非常整洁。
使用表名前缀列名是一种保证唯一列名的方法,这使得连接更容易。
但这是一个令人厌倦的做法,特别是如果我们有长桌名称。 在适当的时候使用别名通常更容易。 此外,当我们自我加入时,它没有帮助。
作为数据建模者,我发现很难始终保持一致。 使用ID列我理论上更喜欢只有ID
但我通常会发现我的表有名为USER_ID
, ORDER_ID
等的列。
在某些情况下,在多个表中使用公共列名称会非常有益。 例如,当逻辑超类型/子类型关系被渲染为子表时,在所有子类型表(例如ITEM_STATUS
)上保留超类型列而不是为每个子表重命名它是有用的。 -type( ORDER_ITEM_STATUS
, INVOICE_ITEM_STATUS
等)。 当它们是具有一组共同值的枚举时尤其如此。
例如,您的数据库具有存储有关销售和人力资源部门的信息的表,您可以命名与销售部门相关的所有表,如下所示:
SL_NewLeads SL_Territories SL_TerritoriesManagers
您可以命名与人力资源部门相关的所有表格,如下所示:
HR_Candidates HR_PremierInstitutes HR_InterviewSchedules
这种命名约定可以确保,当您按字母顺序列出所有表时,所有相关表都会组合在一起。 但是,如果数据库仅处理一个逻辑表组,则无需使用此命名约定。
请注意,有时您最终会将表垂直分区为两个或更多表,尽管这些分区实际上代表了同一个实体。 在这种情况下,请将最能标识分区的单词附加到实体名称
实际上,这种命名是有原因的,特别是在涉及领域时,你可能会加入。 至少在MySQL中,你可以使用USING
关键字而不是ON
,然后users u JOIN posts p ON p.user_id = u.id
成为users u JOIN posts p USING(user_id)
这是更清洁的IMO。
关于其他类型的字段,在选择*
时可能会受益,因为您不必指定所需字段的列表,并确保哪个字段来自哪个表。 但一般来说,在性能和维护性方面不鼓励使用SELECT *
,所以我认为在这些字段前加上表名是一种不好的做法,尽管它可能因应用程序而异。
我们应该使用tablename的前缀来定义主键。
如果id和post_id而不是id,我们应该使用use_id。
好处 : -
1)易于阅读
2)轻松区分联接查询。 我们可以在查询中最小化别名的使用。
用户表:user_id(PK)
post表:post_id(PK)user_id(FK)这里用户表PK和post表FK是一样的
根据文件 ,
3)这样我们可以通过USING获得NATURAL JOIN和JOIN的 好处
USING的自然连接和连接(包括外连接变体)根据SQL:2003标准进行处理。 目标是根据SQL:2003将NATURAL的语法和语义与NATURAL JOIN和JOIN ... USING对齐。 但是,联接处理中的这些更改可能会导致某些联接的输出列不同。 此外,一些似乎在旧版本(5.0.12之前)中正常工作的查询必须重写以符合标准。
这些变化有五个主要方面:
1)MySQL确定NATURAL或USING连接操作的结果列的方式(以及整个FROM子句的结果)。
2)将SELECT *和SELECT tbl_name。*扩展为所选列的列表。
3)在NATURAL或USING连接中解析列名。
4)将NATURAL或USING连接转换为JOIN ... ON。
5)在JOIN ... ON的ON条件下解析列名。
例子:-
SELECT * FROM user NATURAL LEFT JOIN post;
SELECT * FROM user NATURAL JOIN post;
SELECT * FROM user JOIN post USING (user_id);
听起来像结论是:如果字段名称在表中是唯一的 - 前缀与表名称。 如果字段名称可能在其他表中重复,请将其命名为唯一。
我找到了诸如“img,address,phone,year”之类的字段名称,因为不同的表格可能包含不同的图像,地址,电话号码和年份。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.