多对多关系的SQL模式设计

3
考虑到我有4个表:
  • persons
  • companies
  • groups
  • bills
现在,bills/persons、bills/companies和bills/groups之间存在多对多的关系。为此,我看到了以下4种可能的SQL架构:

变体1(多个关系表)

  • persons_bills
    • person_id
    • bill_id
  • companies_bills
    • company_id
    • bill_id
  • groups_bills
    • group_id
    • bill_id

变体2(只有一个关系表,其中一个ID集为非空值,其他都为空)

  • bills_relations
    • person_id
    • company_id
    • group_id
    • bill_id
并通过检查只能设置person_id、company_id或group_id中的一个,并使其他两个都为空的方法。

变体3(只有一个关系表,其他表用字符串引用)

  • bills_relations
    • bill_id
    • row_id
    • row_table
其中row_table可以具有字符串值'person'、'company'或'group'。

变体4(添加一个超类型表)

  • persons
    • id
    • debtor_id
  • companies
    • id
    • deptor_id
  • groups
    • id
    • deptor_id
  • deptors
    • id
  • bills_deptors
    • bill_id
    • deptor_id
您可以推荐一种变体吗?

3
变体1(多个关系表)最合适。易于管理。 - Hasnain Bukhari
2
我建议使用变体1。 - Alessio Cantarella
1个回答

4
我认为在这里,变种1(多个关系表)或变种4(添加超类型表)是最可行的选择。
变种2是存储数据的一种效率较低的方式,因为它需要存储每个关系的3个额外的NULL。
变种3将在尝试在账单和其他表之间进行连接时让你遇到很多麻烦,因为你不能直接这样做。你必须先从字符串引用中选择表名,然后将其注入到第二个查询中。像这样的任何SQL注入都会向数据库打开一个SQL注入攻击,所以如果可能的话最好避免这样做。
在我看来,变种1可能是1和4中最好的选择,因为它将在你的查询中需要少一个JOIN,因此使它们稍微简单一些。但如果所有的表都正确地索引了,我不认为在这两种方法之间会有太大的性能差异(或空间效率差异)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接