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

时间:2012-02-18 23:26:03

标签: c# sql-server winforms

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

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

7 个答案:

答案 0 :(得分: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.FirstNameCustomer.FirstName - 因此添加Person或{{1对于任何必须编写此类查询的人来说,前缀只是多余的而且很烦人。

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

当然所有这些都是非常主观的。这就像问100个人你应该开什么车。你将会得到一些答案,现在你需要仔细考虑废话,找出对你,你的团队和你的环境有意义的东西。 : - )

答案 1 :(得分:3)

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

  1. 这是不必要的重复
  2. 维护起来比较困难,因为如果表名在将来发生变化,所有列都需要重命名。
  3. 对于下一行的其他实施者来说,惯例可能并不清楚
  4. 执行查询时,如果您需要表名,则始终可以为该列添加别名。
  5. 如果列是另一个表的外键,我只会在列中使用表名。如果使用此约定,则可以相对轻松地在不使用关系图的情况下识别表中的外键列。

答案 2 :(得分:2)

我认为你的第一个例子更好。 (第二个是在构建查询时感到困惑,并且通常需要AS sql关键字)

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

使用参数调用存储过程时,应该颠倒约定(@personID, @departmentID

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

我想尝试在整个数据库中保持列名唯一。我通过使用表和列的前缀来做到这一点,甚至外键都是唯一命名的。这使得连接更简单,因为我(通常)不需要引用连接中的表:

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