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