繁体   English   中英

MySQL命名约定,字段名称是否应包含表名?

[英]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_IDORDER_ID等的列。

在某些情况下,在多个表中使用公共列名称会非常有益。 例如,当逻辑超类型/子类型关系被渲染为子表时,在所有子类型表(例如ITEM_STATUS )上保留超类型列而不是为每个子表重命名它是有用的。 -type( ORDER_ITEM_STATUSINVOICE_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.

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