列名在所有表中都应该是唯一的吗

本文关键字:唯一 | 更新日期: 2023-09-27 18:25:15

在我创建的大多数数据库中,我总是通过预先附加表名来命名列名。例如:

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中使用这些数据库。

列名在所有表中都应该是唯一的吗

我不喜欢这两个例子。我更喜欢:

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.FirstNameCustomer.FirstName,所以添加PersonCustomer前缀对于任何必须编写此类查询的人来说都是多余和烦人的。

此外,Timestamp对于SQL Server模型中的列(或作为列后缀)来说是一个可怕的名称,因为TIMESTAMP是一种与日期或时间无关的数据类型,并且该名称可能对您的同行意味着其他用途。

当然,所有这些都是非常主观的。这就像问100个人你应该开什么车。你会得到一些答案,现在就由你自己来解决这些问题,找出什么对你、你的团队和你的环境都有意义。:-)

根据我的经验,列的更标准的命名约定是不包括表名,原因如下:

  1. 这是不必要的重复
  2. 这很难维护,因为如果表名将来发生更改,则所有列都需要重命名
  3. 另一个实施者可能不清楚该公约
  4. 执行查询时,如果需要列中的表名,则可以随时对列进行别名

只有当列是另一个表的外键时,我才会在该列中使用表名。如果使用这种约定,那么在不使用关系图的情况下,可以相对容易地识别表中的外键列。

Ugghhh,我想我太懒了,所以我会做Department.ID而不是Department.DepartmentID。我有足够的冗余工作。

我认为你的第一个例子更好。(第二个问题在构建查询时会令人困惑,并且通常需要ASsql关键字)

然而,在我的商店里,我们使用了一种稍微不同的惯例
PrimaryKey-此列应以ID开头,后跟表名(IDPerson
ForeingKey-此列的名称应以ID开头,后跟外部表的名称(IDDepartment
其他列-它们应该为所包含的数据有一个有意义的名称。只需要为那些在不同表中碰巧具有相同名称的字段重复表名。

当使用参数调用存储过程时,您应该反转约定(@personID, @departmentID

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

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

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

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

--------------------
 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';