多对多关系的SQL模式

多对多关系的SQL模式,sql,Sql,假设我有4张桌子 人 公司 团体 及 账单 现在,账单/个人与账单/公司和账单/团体之间存在多对多关系 我认为sql模式有4种可能性: 变量1(多个关系表) 人事条例草案 个人识别码 账单 公司条例草案 公司id 账单 团体条例草案 组id 账单 变量2(一个关系表具有一个id集,其他所有关系表均为空) 法案与国际关系 个人识别码 公司id 组id 账单 检查是否只能设置个人id、公司id或组id,并且所有其他两个都为空 变量3(一个关系表与另一个表的字符串引用)

假设我有4张桌子

  • 公司
  • 团体

  • 账单
现在,账单/个人与账单/公司和账单/团体之间存在多对多关系

我认为sql模式有4种可能性:

变量1(多个关系表)
  • 人事条例草案
    • 个人识别码
    • 账单
  • 公司条例草案
    • 公司id
    • 账单
  • 团体条例草案
    • 组id
    • 账单
变量2(一个关系表具有一个id集,其他所有关系表均为空)
  • 法案与国际关系
    • 个人识别码
    • 公司id
    • 组id
    • 账单
检查是否只能设置个人id、公司id或组id,并且所有其他两个都为空

变量3(一个关系表与另一个表的字符串引用)
  • 法案与国际关系
    • 账单
    • 行id
    • 行表
使用row_,表格可以有字符串值“person”、“company”、“group”

变量4(添加超类型表)
    • 身份证
    • 债务人身份证
  • 公司
    • 身份证
    • 副部长
  • 团体
    • 身份证
    • 副部长
  • 副部长
    • 身份证
  • 条例草案秘书
    • 账单
    • 副部长

您能推荐一个变体吗?

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

变量2存储数据的效率要低得多,因为它需要为每个关系存储3个额外的空值

变体3在尝试在账单和其他某个表之间加入
时会给您带来很多麻烦,因为您无法直接这样做。您必须首先从字符串引用中选择表名,然后将其插入到第二个查询中。任何类型的SQL注入都会使数据库遭受SQL注入攻击,因此最好尽可能避免这些攻击


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

变体1(多个关系表)最合适。它很容易管理。我建议使用变体1。