在数据库中标记列的有效方法是什么?

Tho*_*s O 30 erd database-design

我曾经像这样标记数据库中的列:

user_id
user_name
user_password_hash
Run Code Online (Sandbox Code Playgroud)

为了避免在连接两个表时发生冲突,但后来我学到了更多关于如何为表设置别名的知识,我不再这样做了。

在数据库中标记列的有效方法是什么?为什么?

Spr*_*dzy 33

在您的情况下,前缀用户是多余的。我们(负责的开发人员)知道这是表用户,那么为什么要user_在每个字段前添加前缀呢?

我建议你用更自然的方法来做。

一个人的特征是什么:姓氏、名字、出生日期、国籍等...

汽车的特征是什么:型号、年份、颜色、能源等...

您的专栏应该命名为尽可能自然,这将使架构对每个人、您和您之后的人都更加清晰。这也称为维护阶段,您可以做的任何使维护更容易的事情通常都是值得的。


Dav*_*all 17

除了 Spredzy 的评论之外,将您的主键标记为相同 ( ID ),这样当您即时编写查询时,您可以轻松回忆 (u.ID=c.ID) 而不必查找“Was it countryID , country_ID, countries_ID, countryID, ?"

  • 我们通常使用 tablename.tablename_id。例如 car.car_id; person.person_id。表的单数名称。 (6认同)
  • 我曾经在一个数据库上工作,其中 DBA 决定在某些表中使用 ID,在其他表中使用 id,我们将 MySQL 设置为区分大小写……很有趣! (5认同)

bso*_*ist 9

我完全同意 David Hall 对 Spredzy 出色答案的补充。简单和自然是要走的路。如果您也自然地命名表格,表格混淆应该不是问题。

当您可以拥有 users.id 和 cars.id 时,拥有 users.user_id 和 cars.car_id 毫无意义


eie*_*fai 7

让我们看看,用你的例子,它看起来像这样:

USERS
----
id
username,
password
registration_date
Run Code Online (Sandbox Code Playgroud)

我使用大写的表名。这让我可以轻松识别表格。我刚刚命名的列分别代表它所代表的内容。我尽量不使用数字或包含任何前缀或后缀。这将使查询变得简单而直接。

顺便说一句,我认为你应该找到一些你喜欢的风格并坚持下去。如果您经常更改它,那么您将拥有更混乱的 DB 模式。


Pet*_*aut 7

我认为在数据库模式中,每个列都应该有一个跨表的唯一名称。这有几个原因:

  • 从建模的角度来看:您从一系列属性开始,然后将其规范化为表格。随着时间的推移,您可能会进一步反规范化或规范化,或者引入视图或物化视图,或者引入新表。如果所有列名都是唯一的,这永远不会成为问题。

  • 您可以使用以下连接语法:a JOIN b USING (a_id) JOIN c USING (a_id). 非常方便,也有助于解决以下几点。

  • 如果您运行具有大量连接的查询或使用 来创建物化视图SELECT *,您将永远不会(好吧,也许很少)发生冲突。想想加盟person.nameproduct.namecountry.name,等Urgh。

  • 一般来说,如果您有大量查询,则很难跟踪id各处的含义。


Tan*_*ena 5

与其他人一样,我建议您不要将表名作为列的一部分。除非您有数百个表都具有大部分相似的列名:如果您有几十个表都带有标题为 ID 的列,那么一定要在它们前面加上表名。

我最近离开了一家公司,其中一位开发人员更喜欢用 pk 和 fk 作为主键和外键列的前缀。这导致了一些令人厌恶的情况,其中列以 pkfk 开头(通常是基于 2 列的复合主键,其中一列是另一个表的外键)。

  • 这算作 fk_cluster 吗? (4认同)

ber*_*d_k 5

我在一个环境中工作,每个列名都以从表名派生的前缀开头,这不是我的发明,但我很满意。

理想情况下,列名在数据库中的所有表中都是唯一的。

一些观察:

  • 我们只需要表别名,当表在 select 语句中多次连接时
  • 它可以防止复制代码片段时出现一些错误,因为列名必须适应表名
  • 它有助于显示外键列指向哪个表

一般想法:最重要的是每个命名约定的一致性: - 单数与复数(适用于表而不是列) - 识别主键和外键(它们构建结构与数据库的内容) - 在以下情况下保持一致您存储字符串和同一字符串的短变体 - 与标志、状态等保持一致。