Вы можете использовать общий базовый тип для всех типов сущностей и обрабатывать отношения через этот базовый тип - это то, что практически любой инструмент ORM может сделать, используя столбец дискриминатора и отношения внешнего ключа (хотя я не знаком с CLSA, хотя ).
При таком подходе вы получаете ровно одну таблицу отношений.
Edit:
Вот как это настроить:
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 должен быть раздел о том, как отобразить полиморфизм с помощью базовой таблицы.