代码之家  ›  专栏  ›  技术社区  ›  Pete Michaud

多个表之间共享关系的最佳实践

  •  2
  • Pete Michaud  · 技术社区  · 17 年前

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

    我有两个或更多的实体,比如人和狗,它们都与一个Notes表有关系,它存储一个消息字段和一些关于消息的元数据,比如作者。

    1)第一个选项是不强制使用外键。这样,我可以将fk类的peopleid或dogid(无论是什么)存储在同一个类似fkid的通用fk字段中。然后我将TableID存储在另一列中——人们可以希望从RDMS元数据中获取表ID,但是您也可以有一个肮脏的黑客程序,并显式地生成一个包含必须手动更新的表的表。这真的很草率,我只是为了完整性而提到它。

    2)为每个需要它的表(如peoplenotes、dognotes、catnotes等)克隆notes表,这会造成相当严重的规范化问题。

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

    5 回复  |  直到 16 年前
        1
  •  6
  •   jd.    16 年前

    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
  •  2
  •   n8wrl    17 年前

        3
  •  0
  •   GSto    17 年前

        4
  •  0
  •   KM.    17 年前

    PeopleID
    NoteID
    .....
    

    DogID
    NoteID
    ...
    

    NoteID
    

    NoteDetailID
    NoteID
    NoteText
    ...
    
        5
  •  0
  •   Billy Korando    16 年前

    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