假设我有以下表格:Customer
和Staff
.
Customer (CusID, CusName, CusAddres, CusGender)
Staff (StaID, StaName, StaAddress, StaGender)
对比
Customer(ID, Name, Address, Gender)
Staff(ID, Name, Address, Gender)
哪种设计更受欢迎,为什么?
假设我有以下表格:Customer
和Staff
.
Customer (CusID, CusName, CusAddres, CusGender)
Staff (StaID, StaName, StaAddress, StaGender)
对比
Customer(ID, Name, Address, Gender)
Staff(ID, Name, Address, Gender)
哪种设计更受欢迎,为什么?
SQL 使用了一个称为域名完整性的概念,这意味着对象的名称具有由其容器指定的范围。
列名必须是唯一的,但只能在包含这些列的表的上下文中。表名必须是唯一的,但只能在包含表等的模式的上下文中。
当您查询列时,您需要引用您感兴趣的模式、表和列,除非可以推断出其中的一个或多个。除非您的查询非常简单以至于它只引用一个表,否则您将需要直接引用表名或使用别名,例如 Customer.ID 或来自客户 C 的 C.ID 等。
第一个选项是对所有列名唯一性的技术要求的回归,这适用于旧的 ISAM 数据库和 1960 年代和 70 年代的 COBOL 等语言。这在 1980 年代无缘无故地被拖到 dBase 中,并且在关系和对象 DBMS 时代作为一种惯例一直存在。 抵制这种过时的惯例。
第二种方法更简单,更易读。更简单、更易读的代码更容易编写和维护。
键是沿外键“传播”的,因此如果它们在所有生成的“副本”中保持名称不变,这将很有用。它只是使数据库模式更清晰:您不必查看 FK 定义1即可查看特定字段的来源 - 您只需查看其名称即可做到这一点。
另一方面,非关键字段不会传播,并且没有特别的理由在各自的表之外保持它们的名称唯一。
所以,我推荐一种混合方法:
例如:
Customer (CustomerID, Name, Addres, Gender)
Staff (StaffID, Name, Address, Gender)
如果你碰巧在这两个2之间有一个连接表,它会看起来像这样......
CustomerStaff(CustomerID PK FK1, StaffID PK FK2)
...所以不需要重命名(如果两个父键都被命名,那将是必要的),并且ID
立即清楚从哪里来。此外,我个人不喜欢在前缀中缩短表名(因此而不是),因为这使得命名更加“机械”和可预测。CustomerID
StaffID
CustomerID
CusID
1可能有多个级别!
2只是一个例子。是否有意义是另一回事。
ID 是一个 SQL 反模式(http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1343835938&sr=1-1&keywords=sql+antipatterns) , 从不命名列 ID。我会使用:
Customer(CustomerID, Name, Address, Gender)
Staff(StaffID, Name, Address, Gender)
我会说第二种选择更好。如果您决定更改表名,则不必更改所有列的名称。此外,当您编写 SELECT 语句时,通常无论如何都会使用别名(“select sta.name, sta.adress from staff sta...”)一般来说,当有疑问时,总是选择一个更简单的解决方案。
每个行业都有自己的标准。在这两种设计风格中都是正常的。建议使用第一个。
Customer(CusID, CusName, CusAddres, CusGender)
Staff(StaID, StaName, StaAddress, StaGender)
因为它使用表名符号Customer
toCus
和Staff
to Sta
。它有助于项目良好的维护。
一些组织也使用vch
数据VARCHAR
类型,int
数据INT
类型。
像
Customer(intCusID, vchCusName, vchCusAddres, vchCusGender)
Staff(intStaID, vchStaName, vchStaAddress, vchStaGender)