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

时间:2009-10-13 18:42:52

标签: database-design relational

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

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

1)第一个选项是不强制执行外键。这样我可以像fkId一样在fk字段中存储类似peopleId或dogId(无论它是什么)的FK。然后我将tableId存储在另一列中 - 可以希望从RDMS元数据中获取表id,但是你也可能有一个脏的hack并明确地创建一个表,你必须手动更新表。这真是草率,我只是提到它的完整性。

2)为需要它的每个表克隆Notes表,如PeopleNotes,DogNotes,CatNotes等。这会产生一个非常重要的规范化问题。

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

5 个答案:

答案 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。 我知道这个答案就像事后九个月一样。在做其他研究的时候发生了这件事,并且认为我把自己的两分钱放进去了。