在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文档中应有一节介绍如何将多态性与基表映射。