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

时间:2009-08-23 10:48:35

标签: php mysql database naming-conventions

一位朋友告诉我,我应该将表名包含在同一个表的字段名中,我想知道为什么?它应该是这样吗? 示例:

(Table) Users  
(Fields) user_id, username, password, last_login_time

我看到前缀'user_'没有意义,因为我知道它已经是一个用户。但我也想听听你的意见。 注意:我正在编写php,mysql。

9 个答案:

答案 0 :(得分:13)

我同意你的看法。我唯一想把表名或缩写形式放在主键和外键上或者“自然”名称是关键字的地方。

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”是关键字。

至少那是我的惯例。您的里程可能会有所不同。

答案 1 :(得分:10)

我认为没有理由包含表名,这是多余的。在查询中,您可以将字段称为< table name>。< field name>无论如何(例如“user.id”)。

答案 2 :(得分:4)

使用'id'和'name'等通用字段,最好将表名放入。

原因是在跨多个表编写连接时可能会造成混淆。

这是个人偏好,真的,但这背后的原因(我总是这样做)。

无论选择哪种方法,都要确保它在项目中保持一致。

答案 3 :(得分:3)

我个人不会在主表中为字段名添加表名,但是当在另一个表中使用它作为外来字段时,我会在其前面加上源表的名称。例如users表上的id字段将被称为id,但在评论表中,评论链接到发布它们的用户,它将是user_id。

这是我从CakePHP的命名方案中获得的,我觉得它非常整洁。

答案 4 :(得分:2)

使用表名前缀列名是一种保证唯一列名的方法,这使得连接更容易。

但这是一种令人厌倦的做法,特别是当我们有长桌名时。在适当的时候使用别名通常更容易。此外,当我们自我加入时,它没有帮助。

作为一名数据建模师,我发现很难始终保持一致。使用ID列我理论上更喜欢只有ID,但我通常会发现我的表格中包含USER_IDORDER_ID等列。

在某些情况下,在多个表中使用公共列名称会非常有益。例如,当逻辑超类型/子类型关系被渲染为子表时,在所有子类型表(例如ITEM_STATUS)上保留超类型列而不是重命名是有用的。它适用于每个子类型(ORDER_ITEM_STATUSINVOICE_ITEM_STATUS等)。当它们是具有一组共同值的枚举时尤其如此。

答案 5 :(得分:1)

例如,您的数据库具有存储有关销售和人力资源部门的信息的表,您可以命名与销售部门相关的所有表,如下所示:

SL_NewLeads SL_Territories SL_TerritoriesManagers

您可以命名与人力资源部门相关的所有表格,如下所示:

HR_Candidates HR_PremierInstitutes HR_InterviewSchedules

这种命名约定确保,当您按字母顺序列出所有表时,所有相关表都会组合在一起。但是,如果数据库只处理一个逻辑表组,则无需使用此命名约定。

请注意,有时您最终会将表垂直分区为两个或更多表,尽管这些分区实际上代表了同一个实体。在这种情况下,将最能标识分区的单词附加到实体名称

答案 6 :(得分:1)

实际上,这种命名是有原因的,特别是涉及领域时,你可能会加入。至少在MySQL中,您可以使用USING关键字而不是ON,然后users u JOIN posts p ON p.user_id = u.id变为users u JOIN posts p USING(user_id),这是更清洁的IMO。

关于其他类型的字段,您可能会在选择*时受益,因为您不必指定所需字段的列表,并确保哪个字段来自哪个表。但一般来说,在性能和维护性方面不鼓励使用SELECT *,所以我认为在这些字段前加上表名是一种不好的做法,尽管它可能因应用程序而异。

答案 7 :(得分:0)

听起来像结论是: 如果字段名在表之间是唯一的 - 带有表名的前缀。如果字段名称可能在其他表中重复,请将其命名为唯一。

我找到了诸如“img,address,phone,year”之类的字段名称,因为不同的表可能包含不同的图像,地址,电话号码和年份。

答案 8 :(得分:0)

我们应该使用tablename的前缀定义主键。

我们应该使用use_id代替id和post_id,而不仅仅是id。

好处: -

1)易于阅读

2)轻松区分联接查询。我们可以在查询中最小化别名的使用。

用户表:user_id(PK)

帖子表:post_id(PK)user_id(FK)这里用户表PK和帖子表FK相同

根据documentation

3)这样我们就可以获得天然加入的好处并使用加入

  

与USING的自然连接和连接,包括外连接变体,是   根据SQL:2003标准处理。目标是调整   关于NATURAL JOIN和MySQL的MySQL的语法和语义   加入...根据SQL:2003使用。但是,这些变化加入了   处理可能会导致某些连接的输出列不同。   此外,一些查询似乎在旧版本中正常工作   (在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);