在RDBMS中存储完整的图形
时间:2020-03-06 14:50:48 来源:igfitidea点击:
我有几种类型的实体,每种都有自己的字段,这些字段存储在单独的表中。
这样的表中的每个记录可以连接到不同表中的零个或者多个记录,即,链接到来自不同实体类型的记录。
如果使用查找表,则会得到需要初始化的(m(m-1))/ 2 = O(m ^ 2)个单独的查找表。
虽然对于6或者7种不同的实体类型仍然可行,但对于50多个此类类型是否仍然有意义?
特别地,给定的记录将需要具有到大多数其他实体类型的链接,因此从理论上讲,我将处理一个接近完整的,无向的,n边的图。
谁能阐明如何在关系DBMS中存储此结构?
(如果需要的话,我使用的是Postgresql,但是其他DBMS的任何解决方案也同样有用)。
感谢时间!
尤瓦尔
解决方案
这是对象关系映射,这是一个经典的难题。我们确实需要一个ORM工具来正确执行此操作,否则它将使我们发疯。
我们提到的连接问题是陷阱之一,它需要非常仔细的优化和查询调整,否则会降低性能(例如N + 1 SELECT问题)。
在不知道应用程序平台是什么的情况下,我不能说得更具体些,实际使用的DBMS确实与问题无关。
另一种选择是使用面向对象的数据库,例如db40或者Cache。如果性能不是很重要的问题,并且我们决定存储整个对象图,那么它可能正在调查此问题。
我们可以对所有实体类型使用通用的基本类型,并通过该基本类型处理关系,这几乎是任何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文档中应有一节介绍如何将多态性与基表映射。