我有几种类型的实体,每种实体都有自己的字段,这些字段存储在不同的表中 这样的表中的每个记录可以连接到不同表中的零个或多个记录,即链接到来自不同实体类型的记录。
如果我使用查找表,我得到(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。如果性能不是一个大问题,并且您决定存储整个对象图,那么它可能正在研究这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top