1

我有几种类型的实体,每种都有自己的字段,它们存储在单独的表中。
这种表中的每条记录可以连接到不同表中的零个或多个记录,即链接到来自不同实体类型的记录。
如果我使用查找表,我会得到 (m(m-1))/2=O(m^2) 需要初始化的单独查找表。
虽然对于 6 或 7 种不同的实体类型仍然可行,但它仍然适用于 50 多种此类类型吗?
特别是,给定的记录需要与大多数其他实体类型有链接,所以从理论上讲,我将处理一个几乎完整的、无向的 n 边图。
任何人都可以阐明如何将这种结构存储在关系 DBMS 中吗?
(如果重要的话,我正在使用 Postgresql,但其他 DBMS 的任何解决方案都同样有帮助)。
感谢您的时间!

尤瓦尔

4

3 回答 3

2

这是对象关系映射,一个经典的难题。你真的需要一个 ORM 工具来正确地做到这一点,否则它会让你发疯。

您提到的连接问题是陷阱之一,它需要非常仔细的优化和查询调整,否则会影响性能(例如 N+1 SELECT 问题)。

在不知道您的应用程序平台是什么的情况下,我无法更具体 - 实际使用的 DBMS 与问题并不真正相关。

于 2008-09-28T15:33:02.717 回答
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 解决方案为行 (type1type2) 找到正确的子类型。ORM 文档应该有一节介绍如何使用基表映射多态性。

于 2008-09-28T16:05:44.120 回答
0

另一种选择是使用面向对象的数据库,例如 db40 或 Cache。如果性能不是一个大问题并且您决定存储整个对象图,它可能会对此进行研究。

于 2008-09-28T15:39:05.057 回答