【问题标题】:Best Practice for relationships shared among multiple tables在多个表之间共享关系的最佳实践
【发布时间】:2010-06-05 05:32:23
【问题描述】:

我一直遇到这个设计问题,到目前为止我对我的解决方案并不满意。问题是这样的:

我有两个或多个实体,例如 People 和 Dogs,它们都与 Notes 表有关系,该表存储消息字段和有关消息的一些元数据,例如作者。

1) 第一个选项是不强制执行外键。这样,我可以将诸如 peopleId 或 dogId(无论它是什么)之类的 FK 存储在与 fkId 相同的通用 FK 字段中。然后我将 tableId 存储在另一列中——希望从 RDMS 元数据中获取表 id,但你也可能有一个肮脏的 hack 并明确地制作一个充满你必须手动更新的表的表.这真的很草率,我只是为了完整性而提到它。

2) 为每个需要它的表克隆 Notes 表,例如 PeopleNotes、DogNotes、CatNotes 等。这会产生相当大的规范化问题。

其他人在这种情况下做了什么?

【问题讨论】:

    标签: database-design relational


    【解决方案1】:

    如果这些是您的“模型”表:

    dog Table:
    id | name | ...
    1  | Rex
    2  | Fido
    
    people Table:
    id | name | ...
    1  | Bob
    2  | Alice
    
    notes Table:
    id | text | ...
    1  | A nice dog.
    2  | A bad dog.
    3  | A nice person.
    

    您可以将关系保存在单独的表中:

    dog_note Table:
    dog_id | note_id
    1      | 1
    2      | 2
    
    note_people Table:
    person_id | note_id
    1         | 3
    2         | 3
    

    我通常坚持使用模型的字母顺序来命名关系表的约定。

    【讨论】:

      【解决方案2】:

      两个新表——Dog2Notes 和 People2Notes 怎么样? Dogs、People 和 Notes 都是具有相互关联的 Key 的实体。 Dogs 和 People 可以拥有多个便笺,并且可以共享便笺。

      如果 Dogs 和 People 每个只能有一个注释,那么为每个表格添加一个 NOteID?

      【讨论】:

        【解决方案3】:

        我更喜欢将便笺的所有者存储在两列中,一列用于 ID,另一列用于类/表。

        【讨论】:

          【解决方案4】:

          这真的取决于你如何查询你的数据,但是像这样的事情怎么样,假设每个人/狗有多个笔记:

          人员表

          PeopleID
          NoteID
          .....
          

          狗桌

          DogID
          NoteID
          ...
          

          笔记表

          NoteID
          

          NoteDetailTable

          NoteDetailID
          NoteID
          NoteText
          ...
          

          【讨论】:

            【解决方案5】:

            难道不是比目前建议的更好的解决方案是拥有一个主 ID 表吗?

            dog Table:
            id | name | masterId
            1  | Rex  |  1
            2  | Fido |  4
            
            people Table:
            id | name | masterId
            1  | Bob  |  2
            2  | Alice|  3
            
            masterId
            id
            1  
            2  
            3  
            4  
            
            notes
            id | note       | masterId
            1  | "Hi"       | 3
            2  | "Good day" | 2
            

            这将使可伸缩性更容易,因为如果您需要添加新的实体类型(例如 cat),则不需要添加另一个表(cat_note),如果您添加新的笔记类型(例如 book ) 因为那时您需要为所有实体类型(person_book、dog_book 等)添加新表。最后,您可以直接将任何实体表与注释表相关联。

            唯一的“问题”是您需要运行一个过程,该过程会在将新记录添加到实体表并将其与新条目相关联时自动将新记录添加到 masterId 表。

            附: 我知道这个答案是事发后九个月。只是在做其他研究时偶然发现了这一点,并认为我自己投入了两分钱。

            【讨论】:

              猜你喜欢
              • 2020-12-15
              • 2014-01-21
              • 2016-01-19
              • 1970-01-01
              • 2015-09-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多