您可以为所有实体类型使用一个通用的基本类型,并通过该基本类型处理关系——这几乎是任何 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 文档应该有一节介绍如何使用基表映射多态性。