我有几种类型的实体,每种实体都有自己的字段,这些实体存储在不同的表中
这样的表中的每个记录可以连接到不同表中的零个或多个记录,即链接到来自不同实体类型的记录。
如果我使用查找表,我会得到(m(m-1))/ 2 = O(m ^ 2)个需要初始化的查找表。
虽然对于6种或7种不同的实体类型仍然可行,但它仍然与50多种这样的类型相关吗?
特别是,给定的记录需要链接到大多数其他实体类型,所以从理论上讲,我将处理一个几乎完整的,非定向的,n面图形。
任何人都可以阐明如何在关系型DBMS中存储这种结构吗?
(如果重要的话,我正在使用Postgresql,但其他DBMS的解决方案同样有用)
谢谢你的时间!
Yuval
答案 0 :(得分:2)
这是对象关系映射,这是一个经典的难题。你真的需要一个ORM工具才能做到这一点,否则它会让你疯狂。
你提到的连接问题是一个陷阱,它需要非常仔细的优化和查询调优,否则它会破坏性能(例如N + 1 SELECT问题)。
如果不知道你的应用程序平台是什么,我就不能再具体了 - 实际使用的DBMS与问题并没有真正相关。
答案 1 :(得分: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解决方案找到行(type1
或type2
)的正确子类型。 ORM文档应该有一节介绍如何将多态性映射到基表。
答案 2 :(得分:0)
另一种选择是使用Object Oriented Database,例如db40或Cache。如果性能不是一个大问题,并且您决定存储整个对象图,那么它可能正在研究这个问题。