具有相同列的相同表的数据建模

时间:2012-08-24 23:26:34

标签: c# sql-server database sql-server-2008 database-design

我有许多具有相同列数和名称的表,因为它们都是查找表。 例如,有LabelType和TaskType表。 LabelType和TaskType表具有TypeID和TypeName列。它们将在其他表中用作外键,例如带有shippingLog表的LabelType表和带有EmployeeTask表的TaskType表。

LabelType Table
TypeID TypeName
1      Fedex
2      UPS
3      USPS

TaskType Table
TypeID TypeName
1      Receiving
2      Pickup
3      Shipping

到目前为止,我有超过20张桌子,我预计它会继续增加。 我没有问题,但我只是想知道是否有更好或更聪明的方式使用表格。我甚至考虑将所有这些表合并为一个查找类型表,并通过从查找表中添加外键来区分它们。查找表可能包含Label,Task等数据。然后,我只需要一个或两个表来查找所有这些查找数据。

如果您有更好或更智能的数据建模方法,请告诉我。

2 个答案:

答案 0 :(得分:6)

仅仅因为数据具有相似的结构并不意味着它具有相同的含义或相同的约束。保持查找表分开。这使外键分开,因此数据库可以保护自己不会引用错误类型的查找数据。 1

我希望关系DBMS支持继承,您可以在父表中定义基本结构,只需在子表中添加特定的FK。就目前而言,你需要在你的DDL中忍受一些重复...

注意:“保持查找表独立”规则的一个例外可能是您的系统需要是动态的(即能够添加新类型的查找数据而不在数据库中实际创建新的物理表),但它不会从你的问题看起来那样。


1 使用一个大的查找表,单独的FK不会停止(例如)ShippingLog表引用一个用于EmployeeTask表的行。通过使用识别关系和迁移PK,您可以保护自己免受此影响,但并非不引入一些冗余并需要一些谨慎的约束。简单地做正确的事情并保持查找表分开,它更干净,可能更高效。

答案 1 :(得分:0)

将查找表分开。它在查找时更快,并且在添加新查找表时,您将在两次查找之间进行数百万次查找。

许多表格不是一个大问题。