列名应该在所有表中都是唯一的吗?
Posted
技术标签:
【中文标题】列名应该在所有表中都是唯一的吗?【英文标题】:Should column names be unique across all tables? 【发布时间】:2012-03-09 20:22:30 【问题描述】:在我创建的大多数数据库中,我总是通过预先附加表名来命名列名。例如:
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 中使用这个数据库。
【问题讨论】:
Best practices for column naming in Sql的可能重复 外键呢?那么为什么不在两个表中使用相同的名称呢? 两个表中的外键相同。例如,如果 Customer 将与 Person 连接,那么在 Person 表 CustomerID 将有 CustomerID 列名。 【参考方案1】:某些列可能重复或具有相同的值,在这种情况下,我通常使用相同的名称作为时间戳等。我使用财务数据并希望将列命名为股票名称本身,而不是给出不同的名称在不同的表中。
【讨论】:
【参考方案2】:根据我的经验,更标准的列命名约定是不包含表名,原因如下:
-
不必要的重复
更难维护,因为如果将来表名更改,所有列都需要重命名。
未来的其他实施者可能不清楚该约定
当您执行查询时,如果您需要其中的表名,您可以随时为列设置别名。
如果列是另一个表的外键,我只会在列中使用表名。如果使用此约定,则无需使用关系图就可以相对容易地识别表中的外键列。
【讨论】:
【参考方案3】:我认为你的第一个例子更好。 (第二个在构建查询时会让人困惑,通常需要AS
sql 关键字)
但是在我的商店中,我们使用了一些不同的约定。PrimaryKey - 此列的命名应以 ID
开头,后跟 tablename (IDPerson
)ForeingKey - 此列的命名应以 ID
开头,后跟外部表的名称 (IDDepartment
)OtherColumns - 它们应该有一个有意义的名称包含的数据。只有在不同表中碰巧具有相同名称的字段才需要重复表名。
当使用参数调用存储过程时,你应该反转约定(@personID, @departmentID
)
【讨论】:
【参考方案4】:Uggghhh,我想我只是太懒了,所以我会使用Department.ID
而不是Department.DepartmentID
。我有足够的冗余工作。
【讨论】:
它也更适合复制粘贴编程。 因为我们都需要复制粘贴ID
?这比仅仅输入ID
...【参考方案5】:
我从来没有在不同的供应商之间看到相同的规则。不知道有没有什么标准,但我觉得没有!
就个人而言,我喜欢您的第二个选项。在列名中重复表名,是不必要的重复。
【讨论】:
【参考方案6】:我不喜欢这两个例子。我更喜欢:
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 个人你应该开什么车。你会得到一些答案,现在由你来处理这些废话,找出对你、你的团队和你的环境有意义的事情。 :-)
【讨论】:
【参考方案7】:我喜欢尝试在整个数据库中保持列名的唯一性。我通过为表和列使用前缀来做到这一点,这样即使外键也可以唯一命名。这使得连接更简单,因为我(通常)不需要引用连接中的表:
--------------------
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's)很好,因为它本质上是根据域命名列。 first_name 是任何表中的 first_name,但 account_id 绝不是 person_id。如果两个东西是相同的,只是在不同的表中,那么它们应该具有相同的名称。如果两件事不同,那么它们应该有不同的名称。属性独立存在并且在它们之间的关系之前存在,因此通过它们的关系为属性添加前缀没有多大意义。以上是关于列名应该在所有表中都是唯一的吗?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle select 语句显示两个表中的匹配列?没有数据,只有两个表中都存在的列名