我一直在遇到这个设计问题,到目前为止我对我的解决方案不满意。问题是:
我有两个或更多实体,比如People和Dogs,它们都与Notes表有关系,它存储了一个消息字段和一些关于消息的元数据,例如作者。
1)第一个选项是不强制执行外键。这样我可以像fkId一样在fk字段中存储类似peopleId或dogId(无论它是什么)的FK。然后我将tableId存储在另一列中 - 可以希望从RDMS元数据中获取表id,但是你也可能有一个脏的hack并明确地创建一个表,你必须手动更新表。这真是草率,我只是提到它的完整性。
2)为需要它的每个表克隆Notes表,如PeopleNotes,DogNotes,CatNotes等。这会产生一个非常重要的规范化问题。
在这种情况下,其他人做了什么?
答案 0 :(得分:6)
如果这些是您的'模型'表:
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
我通常坚持使用模型的字母顺序命名关系表的惯例。
答案 1 :(得分:2)
两个新表怎么样 - Dog2Notes和People2Notes?狗,人和笔记都是具有相互关联的键的所有。狗和人可以有多个音符,可以分享音符。
如果Dogs and People每个只能有一个音符,那么为每个表添加一个NOteID?
答案 2 :(得分:0)
我更喜欢将笔记的所有者存储在两列中,一个用于ID,一个用于类/表。
答案 3 :(得分:0)
这实际上取决于你如何查询你的数据,但是这样的事情怎么样,假设每个人/狗有多个笔记:
PeopleTable
PeopleID
NoteID
.....
DogTable
DogID
NoteID
...
NoteTable
NoteID
NoteDetailTable
NoteDetailID
NoteID
NoteText
...
答案 4 :(得分:0)
当前建议的解决方案不是一个比主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),如果你添加一个新的音符类型(例如书籍)它会特别有用)因为那时你需要为你的所有实体类型(person_book,dog_book等)添加新表。最后,您可以直接将任何实体表与注释表相关联。
唯一的“问题”是您需要运行一个程序,当新记录添加到实体表并将其与新条目关联时,该程序会自动将新记录添加到masterId表。
P.S。 我知道这个答案就像事后九个月一样。在做其他研究的时候发生了这件事,并且认为我把自己的两分钱放进去了。