gpt4 book ai didi

用于多个多对多关系的 SQL 模式

转载 作者:行者123 更新时间:2023-12-05 02:59:35 26 4
gpt4 key购买 nike

假设我有 4 张 table

  • 公司
  • 团体

  • 账单

现在bills/persons和bills/companys和bills/groups之间是多对多的关系。

我看到了 4 种可能的 sql 模式:

变体1(多关系表)

  • persons_bills
    • person_id
    • 账单编号
  • 公司账单
    • 公司编号
    • 账单编号
  • groups_bills
    • group_id
    • 账单编号

变体 2(一个关系表,其中一个 ID 集,所有其他为空)

  • 账单关系
    • person_id
    • 公司编号
    • group_id
    • 账单编号

检查是否只能设置 person_id 或 company_id 或 group_id,而所有其他两个都为空。

变体 3(一个关系表与另一个表的字符串引用)

  • 账单关系
    • 账单编号
    • 行号
    • 行表

row_table 可以有字符串值 'person', 'company', 'group'。

变体 4(添加父类(super class)型表)

  • 个人
    • 编号
    • 债务人编号
  • 公司
    • 编号
    • 部门编号
  • 团体
    • 编号
    • 部门编号
  • 侦探
    • 编号
  • bills_deptors
    • 账单编号
    • 部门编号

你能推荐一种变体吗?

最佳答案

我认为变体 1(多个关系表)或变体 4(添加父类(super class)型表)是这里最可行的选择。

变体 2 是一种效率低得多的数据存储方式,因为它需要为每个关系存储 3 个额外的 NULL。

尝试在 bills 和其他表之一之间JOIN 时,变体 3 会给您带来很多麻烦,因为您无法直接执行此操作。您必须首先从字符串引用中选择表名,然后将其注入(inject)第二个查询。像这样的任何类型的 SQL 注入(inject)都会使数据库受到 SQL 注入(inject)攻击,因此最好尽可能避免它们。

在我看来,变体 1 可能是 1 和 4 中最好的,因为它在您的查询中需要少一个 JOIN,从而使它们更简单一些。如果所有表都正确索引,我认为这两者之间的性能(或空间效率)应该不会有太大差异。

关于用于多个多对多关系的 SQL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57786802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com