如何关联不同类型的请求者?

问题描述 投票:0回答:4

用户索取材料。请求者分为三种类型:个人、部门以及提供材料的供应商。供应商对象也需要与供应商相关。

Request
表中有一个
RequestedByID
外键。但是请求者对于每种类型都有不同的结构,如果将其制作为单个表,则需要非规范化。我该如何处理这个问题?

结构:

  • 请求(
    RequestID
    RequesterID
  • 部门(
    DepartmentID
    DepField1
    DepField2
  • 人 (
    PersonID
    ,
    PersonField1
    ,
    PersonField2
    )
  • 供应商 (
    SupplierID
    ,
    SuppFiel1
    ,
    SuppField2
    )
database database-design
4个回答
2
投票

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

enter image description here

这样,每种请求者类型都可以轻松拥有不同的字段和 FK,同时仍然只有一个 REQUEST 表。本质上,您可以改变请求者,而不必被迫也改变请求。

物理数据库中一般有3种表示继承的方式。您尝试过的本质上是策略#1(将所有类合并到单个表中),但我建议策略#3(每个类都在单独的表中)。


0
投票

您可以有两个不同的 ID:RequesterID 和 RequesterTypeID。 对于“人员”、“部门”和“供应商”,RequesterTypeID 分别为 1、2 或 3,RequesterTypeID 与 RequesterID 配对将共同构成多属性主键。


0
投票

杰克·拉德克利夫的建议可能是最好的选择。所以我只是添加一个替代选项:

您还可以考虑拥有 3 个请求表...一张用于 ppl 请求,一张用于供应商请求,一张用于部门请求...因此您不需要显式存储 RequesterTypeID,因为您可以从名称中推断出它表的...然后,您可以通过“合并”所有 3 个单独的表来将 Jack Radcliffe 表创建为视图...

此外,如果您实施 Jack Radcliffe 方法,您可以创建 3 个视图来模拟我提到的 3 个表...因此,您可以使用最适合每种情况的表/视图,并且如果您想更改方法A 到 B 也很简单...


0
投票

我喜欢 Jack Radcliffe 的想法是,如果将它们存储在单独的表中或使 sql 语句通用以处理应用程序传入的任何数字,则它们可以扩展,例如制造商、实体、子公司等

但是,您选择扩展会带来开销。

© www.soinside.com 2019 - 2024. All rights reserved.