数据库表设计思路。 。

时间:2012-07-19 01:41:00

标签: database database-design

我有数据库结构问题我正在寻找一些意见。

我们假设用户会使用应用程序来请求材料。

需要跟踪请求者是谁。

有三种可能的"类型"请求者。个人(个人),部门和供应商自己提供材料。

此外,供应商对象也需要与供应商相关联。

所以想法在Request表中有一个RequestedByID FK。但是相关的请求者对于每个数据都有这样一个不同的结构,如果它只是一个表(人们拥有不同于部门和供应商的不同属性),它需要一个完全非规范化的表来与之相关。

我对如何处理这个问题有一些想法,但认为SO社区会有一些很好的见解。

感谢您的帮助。

编辑:

伪结构:

请求

请求ID RequesterID

DepartmentID的 DepField1 DepField2

是PersonID PersonField1 PersonField2

供应商

供应商ID SuppFiel1 SuppField2

部门,人员和供应商都有单独的表格,因为它们的属性有很大不同。但是它们中的每一个都可以作为请求的请求者(RequesterID)。如果没有一个(非规范化表)充满不同的可能请求者,最好的方法是什么?

希望这会有所帮助。 。 。

4 个答案:

答案 0 :(得分:2)

您需要将ER建模中的内容称为继承(又称类别,子类型,泛化层次结构等),如下所示:

enter image description here

这样,每个请求者类型都可以轻松拥有不同的字段和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语句通用以处理应用程序传入的任何数字,它们可以扩展为例如制造,实体,子公司等

但是,您选择扩展将需要开销。