2009-10-13 166 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. 我知道這個答案就像事後九個月。在做其他研究的同時,發生了這件事,我想我把自己的兩分錢。

相關問題