有人建議我在項目中使用一張表格,雖然我不能說爲什麼,但我認爲這不是一個好主意。FK專欄指向各種表格
MyTable的(MyTableId PK,類型INT NOT NULL,MyForeignKey INT NOT NULL)
MyForeignKey可以指向取決於類型的值的各種表中的數據。當然,我們不能使用這樣的模型來強制FK的完整性,但是這種說法足以不使用它嗎?
我給你舉個例子,說明它可以用在哪裏。假設系統中有一個Notes表,用於保存有關各種對象的Notes;有關用戶注意事項,有關文件等通常情況下,我想這個模型化像這樣:
筆記(NoteId PK,文字VARCHAR(4000),用戶ID INT NULL,DocumentId INT NULL,...)
什麼我的同事提議是有,而不是這樣一個表:
筆記(NoteId PK,文字VARCHAR(4000),對象類型,的ObjectId)
有了第二個執行,對象類型會告訴我們的ObjectId是否指向一個排在Users表或Documents表中。它的優點是,如果我們想添加另一種類型的對象,則數據庫結構和代碼需要更少的修改。
每個解決方案的優缺點是什麼?
注意:我們永遠不會有無數的對象類型。它應該保持在10以下。
實際上,我們現實生活中的情景有點複雜。它與用戶可能或不可以訪問各種類型的對象(文檔,筆記,事件等)的權限系統有關。
因此,現在在我的數據庫模型中,我有這些對象的表,使用它們和用戶之間的關係的附加表(UserDocuments,UserNotes,UserEvents等)權限通過這些鏈接表中的屬性設置。
我的同事提議有一個單獨的權限表而不是像這樣
權限(PermissionId PK,用戶ID INT,對象類型,的ObjectId,......等權限字段...)
這是一個好主意?
此外,我們可以稱之爲EAV或Open Schema嗎?這與我在這些主題上閱讀的完全不一樣。
我並沒有完全理解你表達的類表層次結構的含義。我在這裏和谷歌上對這個主題進行了一些研究,但是沒有發現任何確鑿的結論......也許是因爲單詞,表格和層次結構過於籠統...... –
你的困惑是我的錯。而不是「Class Table Hierarchy」,我應該說「Class Table Inheritance」。我編輯了我的回覆以反映這一點。我還編輯了你的OP來包含相應的標籤。按照相關示例的標籤。 –