我有数据库结构问题我正在寻找一些意见。
我们假设用户会使用应用程序来请求材料。
需要跟踪请求者是谁。
有三种可能的"类型"请求者。个人(个人),部门和供应商自己提供材料。
此外,供应商对象也需要与供应商相关联。
所以想法在Request表中有一个RequestedByID FK。但是相关的请求者对于每个数据都有这样一个不同的结构,如果它只是一个表(人们拥有不同于部门和供应商的不同属性),它需要一个完全非规范化的表来与之相关。
我对如何处理这个问题有一些想法,但认为SO社区会有一些很好的见解。
感谢您的帮助。
编辑:
伪结构:
请求ID RequesterID
DepartmentID的 DepField1 DepField2
是PersonID PersonField1 PersonField2
供应商ID SuppFiel1 SuppField2
部门,人员和供应商都有单独的表格,因为它们的属性有很大不同。但是它们中的每一个都可以作为请求的请求者(RequesterID)。如果没有一个(非规范化表)充满不同的可能请求者,最好的方法是什么?
希望这会有所帮助。 。 。
答案 0 :(得分:2)
您需要将ER建模中的内容称为继承(又称类别,子类型,泛化层次结构等),如下所示:
这样,每个请求者类型都可以轻松拥有不同的字段和FK,同时仍然只有一个REQUEST表。从本质上讲,您可以对请求者进行varry,而不必强制改变请求。
物理数据库中通常有3 ways to represent inheritance。您尝试的主要是策略#1(合并单表中的所有类),但我建议策略#3(每个类在单独的表中)。
答案 1 :(得分:0)
您可以拥有两个不同的ID:RequesterID和RequesterTypeID。对于Person,Department和Supplier,RequesterTypeID分别只是1,2或3,与RequesterID配对的RequesterTypeID将共同构成一个多属性主键。
答案 2 :(得分:0)
Jack Radcliffe建议的可能是最好的选择。所以我只想添加一个替代选项:
您可能还会考虑有3个请求表...一个用于ppl请求,一个用于供应商请求,一个用于部门请求...因此您不需要显式存储RequesterTypeID,因为您可以从表格的名称......然后您可以通过“联合”所有3个单独的表格来创建表格Jack Radcliffe作为视图......
另外,如果你实施Jack Radcliffe方法,你可以创建3个视图来模拟我提到的3个表...那么你可以使用最适合每种情况的表/视图,如果你想改变从方法A到B,它也很容易......
答案 3 :(得分:0)
我喜欢Jack Radcliffe的想法是,如果将它们存储在一个单独的表中,或者使sql语句通用以处理应用程序传入的任何数字,它们可以扩展为例如制造,实体,子公司等
但是,您选择扩展将需要开销。