2009-10-13 176 views
2

我一直在遇到这个设计问题,至今我对解决方案并不满意。问题是这样的:在多个表格之间共享关系的最佳实践

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

1)第一种选择是不强制外键。这样我就可以将FK存储为像peopleId或dogId(不管它是什么)在相同的通用FK字段中,比如fkId。然后,我将tableId存储在另一列中 - 人们可能希望从RDMS元数据中获取表ID,但是您也可能有一个肮脏的黑客入侵,并且明确地制作一张表,您需要手动更新。这真的很sl and,我只是提到它的完整性。

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

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

回答

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 

我通常使用的按字母顺序排列的惯例坚持我用于命名关系表的模型。

0

我更喜欢将注释的所有者存储在两列中,一个用于ID,另一个用于class/table。

2

如何处理两个新表格 - Dog2Notes和People2Notes?狗,人和笔记都是钥匙相互关联的所有钥匙。狗和人可以有多个笔记,笔记可以共享。

如果狗和人只能有一个注意每个然后添加NOTEID到每个表?

0

这真的取决于你如何查询数据,但如何对这样的事情,假设有每人/狗多个音符:

PeopleTable

PeopleID 
NoteID 
..... 

DogTable

DogID 
NoteID 
... 

NoteTable

NoteID 

NoteDetailTable

NoteDetailID 
NoteID 
NoteText 
... 
0

会不会比目前建议的一个更好的解决办法是有一个主ID表?因为如果你需要增加一个新的实体类型(例如猫),你不会需要添加另一个表(cat_note)

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 

这将使可扩展性更容易,这是非常有用的,如果你添加新笔记键入(例如书),因为那样您需要为所有实体类型(person_book,dog_book等)添加新表。最后,您可以直接将任何实体表与笔记表相关联。

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

P.S. 我知道这个答案就像事后九个月。在做其他研究的同时,发生了这件事,我想我把自己的两分钱。

相关问题