3

假设我有以下表格:CustomerStaff.

Customer (CusID, CusName, CusAddres, CusGender)
Staff (StaID, StaName, StaAddress, StaGender)

对比

Customer(ID, Name, Address, Gender)
Staff(ID, Name, Address, Gender)

哪种设计更受欢迎,为什么?

4

5 回答 5

5

SQL 使用了一个称为域名完整性的概念,这意味着对象的名称具有由其容器指定的范围。

列名必须是唯一的,但只能在包含这些列的表的上下文中。表名必须是唯一的,但只能在包含表等的模式的上下文中。

当您查询列时,您需要引用您感兴趣的模式、表和列,除非可以推断出其中的一个或多个。除非您的查询非常简单以至于它只引用一个表,否则您将需要直接引用表名或使用别名,例如 Customer.ID 或来自客户 C 的 C.ID 等。

第一个选项是对所有列名唯一性的技术要求的回归,这适用于旧的 ISAM 数据库和 1960 年代和 70 年代的 COBOL 等语言。这在 1980 年代无缘无故地被拖到 dBase 中,并且在关系和对象 DBMS 时代作为一种惯例一直存在。 抵制这种过时的惯例。

第二种方法更简单,更易读。更简单、更易读的代码更容易编写和维护。

于 2012-08-01T13:09:20.197 回答
2

键是沿外键“传播”的,因此如果它们在所有生成的“副本”中保持名称不变,这将很有用。它只是使数据库模式更清晰:您不必查看 FK 定义1即可查看特定字段的来源 - 您只需查看其名称即可做到这一点。

另一方面,非关键字段不会传播,并且没有特别的理由在各自的表之外保持它们的名称唯一。

所以,我推荐一种混合方法:

  • 为关键字段名称添加前缀以使它们在所有表中保持唯一,并避免重命名传播的字段。
  • 不要为非关键字段名称添加前缀以使其更短,即使这可能会导致不同表中的某些名称重复。

例如:

Customer (CustomerID, Name, Addres, Gender)
Staff (StaffID, Name, Address, Gender)

如果你碰巧在这两个2之间有一个连接表,它会看起来像这样......

CustomerStaff(CustomerID PK FK1, StaffID PK FK2)

...所以不需要重命名(如果两个父键都被命名,那将是必要的),并且ID立即清楚从哪里来。此外,我个人不喜欢在前缀中缩短表名(因此而不是),因为这使得命名更加“机械”和可预测。CustomerIDStaffIDCustomerIDCusID


1可能有多个级别!

2只是一个例子。是否有意义是另一回事。

于 2012-08-01T15:19:10.927 回答
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) 
于 2012-08-01T15:46:00.797 回答
1

我会说第二种选择更好。如果您决定更改表名,则不必更改所有列的名称。此外,当您编写 SELECT 语句时,通常无论如何都会使用别名(“select sta.name, sta.adress from staff sta...”)一般来说,当有疑问时,总是选择一个更简单的解决方案。

于 2012-08-01T10:12:57.940 回答
0

每个行业都有自己的标准。在这两种设计风格中都是正常的。建议使用第一个。

Customer(CusID, CusName, CusAddres, CusGender)
Staff(StaID, StaName, StaAddress, StaGender)

因为它使用表名符号CustomertoCusStaffto Sta。它有助于项目良好的维护。

一些组织也使用vch数据VARCHAR类型,int数据INT类型。

Customer(intCusID, vchCusName, vchCusAddres, vchCusGender)
Staff(intStaID, vchStaName, vchStaAddress, vchStaGender)
于 2012-08-01T10:06:33.520 回答