【问题标题】:DB table many-to-many connection to children and grandchildren directlyDB表多对多直接连接子孙
【发布时间】:2021-12-24 15:30:58
【问题描述】:

我正在设计一个带有我以前从未遇到过的连接的数据库,并且想知道最好的方法。

假设我有一张发票,该发票可以分配给组织或个人,在某些情况下,个人可以是组织的一部分。

到目前为止,我的想法如下:

Organizations    Invoices           Individuals
-pk              -pk                -pk
-name            -organization_id   -org_member_id
-address_id      -individual_id     -name
-...             -...               -...

因此,如果将发票分配给个人,则使用 individual_id。如果该个人与一个组织相关联,那么through 协会会选择它......(但我想organization_id 将保持为零?)但是,如果仅将一个组织分配给发票,那么personal_id 当然会为零。

不确定解决此问题的最佳方法是什么。提前感谢您的任何建议。

【问题讨论】:

    标签: database many-to-many schema relational-database


    【解决方案1】:

    有多种方法可以解决这个问题。 一种方法:正如您所提到的,如果发票是基于个人的,那么只有 individual_id 被填充,同时保持 organization_id 为空。如果该个人是组织的一部分,那么您可以将该组织的 ID 填写到 organization_id - 因此此列在您的架构中可以为 NULLABLE。如果发票仅分配给一个组织,则填写该 ID 并将 individual_id 保留为 NULL。

    另一种方法:引入一个名为 assignee_type [char(1)] 的列,并使用 O 或 I 来确定分配的类型,然后将 assignee_id 列填充为 Individual或仅组织 ID。当您查询数据时,您需要引用 assignee_type 列,然后基于该联接与组织表或个人表 - 这可能会增加开销。 这两种方法各有优缺点,这取决于您从该 Invoice 表中检索的方式,这将影响您可以采用哪种方法。

    【讨论】:

    • 优秀。说得通。我想除了我最初想到的方法之外,还有另一种方法。我可以想象这个数据库的其他部分更适合后者。我认为对于发票部分,前者可能是最简单的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多