所有表的列名是否应该唯一?

4
在我创建的大多数数据库中,我总是通过在列名前添加表名来命名我的列。例如:
Person Table
 - PersonID
 - PersonName
 - PersonSurName
 - PersonTimestamp

Customer Table
 - CustomerID
 - CustomerName
 - CustomerSurName
 - CustomerTimestamp

与其拥有
Person Table
 - ID
 - Name
 - SurName
 - Timestamp

Customer Table
 - ID
 - Name
 - SurName
 - Timestamp

但我想知道这是否真的是最好的、最方便的,并且日后易于理解。或许一些列,例如timestamp应该在所有表中更好地保留为Timestamp?关于此是否有任何通用的良好实践?我正在使用C# / WinForms中的这些数据库。


可能是Sql列命名的最佳实践的重复问题。 - Chris Shain
外键怎么样?为什么不在两个表中使用相同的名称呢? - TrueWill
外键在两个表中都是相同的。例如,如果客户与人员相关联,则在人员表中,CustomerID将具有CustomerID列名称。 - MadBoy
7个回答

7
我不喜欢这两个例子,我更倾向于以下内容:
Person Table
 - PersonID     -- not ID, since this is likely to be referenced in other tables
 - FirstName    -- why is a first name just a "name"?
 - LastName     -- why not use the form more common than surname?
 - ModifiedDate -- what is a "persontimestamp"?

我坚决反对在模型中的其他表中使用类似“ID”这样的通用名称来命名主键,例如“ON p.ID = SomeOtherTable.PersonID”,我从不想看到这种情况。在模型中,任何一个在多个表中都存在的实体都应该在整个模型中保持一致的命名方式。而像“FirstName”这样的属性只属于该表 - 即使另一个表也有一个FirstName,它也不是同一个“实体”。即使您因为某种原因需要在这两个表之间进行连接,您仍然会将它们区分为“Person.FirstName”和“Customer.FirstName” - 因此添加“Person”或“Customer”前缀只会让编写此类查询的人感到多余和烦恼。
另外,“Timestamp”是一个可怕的列名称(或作为SQL Server模型中的后缀),因为“TIMESTAMP”是一种与日期或时间无关的数据类型,而名称可能会向您的同行暗示其他用法。
当然,所有这些都是相当主观的。这就像询问100个人你应该开什么车一样。你会得到一大堆答案,现在你需要自己去解决什么对你、你的团队和你的环境有意义。 :-)

4
根据我的经验,列的标准命名约定不包括表名,原因如下:
  1. 这是不必要的重复
  2. 如果将来表名更改,所有列都需要重命名,因此难以维护。
  3. 这种约定可能对后续的其他实现者不够清晰
  4. 如果需要在列中使用表名,在查询时始终可以给列取别名。
只有当列是另一个表的外键时,我才会在列中使用表名。 如果使用此约定,则相对容易识别表中的外键列,而无需使用关系图。

2

我认为你的第一个例子更好。(当构建查询并且经常需要使用 AS SQL 关键词时,第二个例子会令人困惑)

但是,在我的店铺中,我们使用稍微不同的约定。
PrimaryKey - 此列应以 ID 开头,后跟表名(IDPerson
ForeingKey - 这些列应以 ID 开头,后跟外部表的名称(IDDepartment
OtherColumns - 它们应具有包含数据的有意义的名称。对于那些在不同表中可能具有相同名称的字段,必须重复表名。

在调用存储过程时使用参数时,应反转这种约定(@personID,@departmentID


2

唉,我想我只是太懒了,所以我会用 Department.ID 而不是 Department.DepartmentID。我已经有足够多的重复工作了。


它也更适合复制粘贴编程,这是有其用处的。 - usr
2
因为我们都需要复制和粘贴“ID”吗?这比只键入“ID”更费力... - Aaron Bertrand

1

有些列可能会重复或具有相同的值,在这种情况下,我通常会使用相同的名称来表示时间戳等。我处理金融数据,并希望将列命名为股票本身的名称,而不是在不同的表中使用不同的名称。


1

我从来没有看到不同供应商之间有相同的规则。我不知道是否存在某些标准,但我认为没有!

就个人而言,我喜欢您的第二个选项。在列名中重复表名是一种不必要的重复。


1

我喜欢尝试在整个数据库中保持列名唯一。我通过为表和列使用前缀来实现这一点,以便即使外键也具有唯一名称。这使得连接更简单,因为我(通常)不需要在连接中引用表:

--------------------
 pe_people
--------------------
  pe_personID (PK)
  pe_firstName
  pe_lastName
  pe_timeStamp
--------------------

--------------------
 ac_accounts
--------------------
  ac_accountID (PK)
  ac_personID (FK)
  ac_accountName
  ac_accountBalance
--------------------

SELECT pe_firstName, pe_lastName, pe_accountName, pe_accountBalance
FROM pe_people
INNER JOIN ac_accounts ON (ac_personID = pe_personID)
WHERE pe_timeStamp > '2016-01-01';

所选答案(Aaron Bertrand的)很好,因为它基本上是根据其域命名列。first_name在任何表中都是first_name,但account_id从不是person_id。如果两个东西相同,只是在不同的表中,则它们应该有相同的名称。如果两个东西不同,则它们应该有不同的名称。属性独立存在于它们之间的关系之前,因此在它们的关系前缀属性并没有太多意义。 - Samuel Danielson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接