用户索取材料。请求者分为三种类型:个人、部门以及提供材料的供应商。供应商对象也需要与供应商相关。
在
Request
表中有一个 RequestedByID
外键。但是请求者对于每种类型都有不同的结构,如果将其制作为单个表,则需要非规范化。我该如何处理这个问题?
结构:
RequestID
,RequesterID
)DepartmentID
、DepField1
、DepField2
)PersonID
, PersonField1
, PersonField2
)SupplierID
, SuppFiel1
, SuppField2
)您需要 ER 建模中的继承(又名类别、子类型、泛化层次结构等),如下所示:
这样,每种请求者类型都可以轻松拥有不同的字段和 FK,同时仍然只有一个 REQUEST 表。本质上,您可以改变请求者,而不必被迫也改变请求。
物理数据库中一般有3种表示继承的方式。您尝试过的本质上是策略#1(将所有类合并到单个表中),但我建议策略#3(每个类都在单独的表中)。
您可以有两个不同的 ID:RequesterID 和 RequesterTypeID。 对于“人员”、“部门”和“供应商”,RequesterTypeID 分别为 1、2 或 3,RequesterTypeID 与 RequesterID 配对将共同构成多属性主键。
杰克·拉德克利夫的建议可能是最好的选择。所以我只是添加一个替代选项:
您还可以考虑拥有 3 个请求表...一张用于 ppl 请求,一张用于供应商请求,一张用于部门请求...因此您不需要显式存储 RequesterTypeID,因为您可以从名称中推断出它表的...然后,您可以通过“合并”所有 3 个单独的表来将 Jack Radcliffe 表创建为视图...
此外,如果您实施 Jack Radcliffe 方法,您可以创建 3 个视图来模拟我提到的 3 个表...因此,您可以使用最适合每种情况的表/视图,并且如果您想更改方法A 到 B 也很简单...
我喜欢 Jack Radcliffe 的想法是,如果将它们存储在单独的表中或使 sql 语句通用以处理应用程序传入的任何数字,则它们可以扩展,例如制造商、实体、子公司等
但是,您选择扩展会带来开销。