2008-09-28 24 views
1

我有幾種類型的實體,每種都有自己的字段,它們存儲在不同的表中。
這樣的表中的每個記錄可以連接到不同表中的零個或多個記錄,即,鏈接到來自不同實體類型的記錄。
如果我使用查找表,我會得到(m(m-1))/ 2 = O(m^2)個需要初始化的查找表。
儘管對於6種或7種不同的實體類型仍然可行,但它對50種以上的這種類型仍然適用嗎?
特別是,給定的記錄需要鏈接到大多數其他實體類型,因此從理論上講,我將處理一個近乎完整的,非定向的n邊圖。
任何人都可以闡明如何將這種結構存儲在關係數據庫管理系統中嗎?
(如果它很重要,我使用Postgresql,但其他DBMS的解​​決方案也同樣有用)。
謝謝你的時間!在RDBMS中存儲完整的圖形

尤瓦

回答

2

這是對象關係映射,一個經典的困難的問題。你真的需要一個ORM工具來正確地做到這一點,否則它會讓你瘋狂。

您提到的連接問題是其中一個缺陷,它需要非常小心的優化和查詢調優,否則會導致性能下降(例如,N + 1 SELECT問題)。

如果不知道你的應用程序平臺是什麼,我就不能更具體了 - 實際使用的DBMS並不是真正相關的問題。

0

另一種選擇是使用Object Oriented Database,如db40或Cache。如果性能不是一個巨大的問題,並且您決定存儲整個對象圖,那麼可能會考慮這一點。

2

您可以對所有實體類型使用通用基類型,並通過該基類型處理關係 - 實際上,任何ORM工具都可以使用鑑別器列和外鍵關係進行處理(我不熟悉CLSA,雖然)。

這種方法只給你一個關係表。

編輯: 這是你如何進行設置:

CREATE TABLE base (
    id int(10) unsigned NOT NULL auto_increment, 
    type enum('type1','type2') NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE type1 (
    id int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_type1_1 FOREIGN KEY (id) REFERENCES base (id) 
); 

CREATE TABLE type2 (
    id int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_type2_1 FOREIGN KEY (id) REFERENCES base (id) 
); 


CREATE TABLE x_relations (
    from_id int(10) unsigned NOT NULL, 
    to_id int(10) unsigned NOT NULL, 
    PRIMARY KEY (from_id,to_id), 
    KEY FK_x_relations_2 (to_id), 
    CONSTRAINT FK_x_relations_1 FOREIGN KEY (from_id) REFERENCES base (id), 
    CONSTRAINT FK_x_relations_2 FOREIGN KEY (to_id) REFERENCES base (id) 
    ON DELETE CASCADE ON UPDATE CASCADE 
); 

注意鑑別列(type),這將有助於你的ORM解決方案找到一個行(type1type2)正確的亞型。 ORM文檔應該有一個關於如何映射多態與基表的部分。

+0

而且我仍然可以保留不同的實體表,或者我需要以某種方式將所有屬性放在一張表中?我在這裏有點困惑... – Yuval 2008-09-28 16:15:26