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

Hoo*_*ayo 2 c# database sql-server database-design sql-server-2008

我有许多具有相同列数和名称的表,因为它们都是查找表.例如,有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
Run Code Online (Sandbox Code Playgroud)

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

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

Bra*_*vic 6

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

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

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


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

  • @Hoorayo,如果出于某种原因,您可以随时通过视图“重新合并”查找表,这使得客户端的事情变得更容易。您甚至可以使用“Kind”字段来指示任何特定行来自哪个表,因此您可以使用单个参数化查询来获取任何表。有关工作示例,请参阅此 [SQL Fiddle](http://sqlfiddle.com/#!3/fa42b/2)。 (2认同)