具有相同结构的表和具有外键的其他表

时间:2017-03-30 22:10:30

标签: mysql database

我想创建3个表(我称之为元素),它们具有几乎相同的结构,以及4个表(信息),每个元素与外键链接。 信息具有相同的结构

CREATE TABLE Information (
     element INT UNSIGNED,
     information INT UNSIGNED,
     PRIMARY KEY (element, information),
     FOREIGN KEY element ON ElementTable(id) ON DELETE CASCADE,
     FOREIGN KEY information ON InformationTable(id) ON DELETE CASCADE
);

问题是我想为所有信息创建一个唯一的表,而不是有12个表(每个元素4个表),如下所示:

CREATE TABLE Information (
     --
     element_type VARCHAR(10),
     information_type VARCHAR(10),
     --
     element INT UNSIGNED,
     information INT UNSIGNED,
     PRIMARY KEY (element, information),
     FOREIGN KEY element ON ElementTable(id) ON DELETE CASCADE,
     FOREIGN KEY information ON InformationTable(id) ON DELETE CASCADE
);

但是外键不能那样工作。
搜索时我发现了“多态关联”,但它失去了可以级联的外键和我正在使用的外键的优点。或者有没有办法在没有外键的情况下模仿级联 此外,在存储和性能方面,我想要创建单个表或12个表(以及做更多(?)请求)这是更好的,因为知道每个元素可以从每种类型的信息中获得10个以上的信息。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用触发器进行插入,更新和删除,第二个表只保留foreigns键并为主键设置标识

答案 1 :(得分:0)

我试过这个

CREATE TABLE ElementInformation (
     element INT UNSIGNED NOT NULL,
     information INT UNSIGNED NOT NULL,
     element_type VARCHAR(10) NOT NULL,
     information_type VARCHAR(10) NOT NULL,
     PRIMARY KEY (element, information, element_type, information_type)
 );

每个元素的触发器

DELIMITER //
CREATE TRIGGER on_delete_element
AFTER DELETE ON Element
FOR EACH ROW
BEGIN
    DELETE FROM ElementInformation WHERE element_type=type AND element=OLD.id;
END//
DELIMITER ;

这是有效的,感谢@Carolina Gil。 我关于性能的最后一个问题没有得到解答,但我猜的只有几千个元素和信息也是如此。