在我创建的大多数数据库中,我总是通过预先附加表名来命名我的列名。例如:
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中使用这个数据库。
答案 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.FirstName
和Customer.FirstName
- 因此添加Person
或{{1对于任何必须编写此类查询的人来说,前缀只是多余的而且很烦人。
Customer
对于SQL Server模型中的列(或作为列后缀)来说是一个可怕的名称,因为Timestamp
是与日期或时间无关的数据类型,并且名称可能意味着对您的同行使用其他用途。
当然所有这些都是非常主观的。这就像问100个人你应该开什么车。你将会得到一些答案,现在你需要仔细考虑废话,找出对你,你的团队和你的环境有意义的东西。 : - )
答案 1 :(得分:3)
根据我的经验,列的更标准命名约定不包括表名,原因如下:
如果列是另一个表的外键,我只会在列中使用表名。如果使用此约定,则可以相对轻松地在不使用关系图的情况下识别表中的外键列。
答案 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';