【发布时间】:2022-01-20 19:03:50
【问题描述】:
我想要一个“实体”和它的许多版本,其中一个版本是唯一一个处于活动/使用状态的版本。实体也有可能完全处于非活动状态。所以我想到了使用两个带有循环外键的表,如下所示:
CREATE TABLE entity (
id int NOT NULL AUTO_INCREMENT,
-- some extra irrelevant data commented out
active_version_id int DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE entityversion (
id int NOT NULL AUTO_INCREMENT,
-- some extra irrelevant data commented out
entity_id int NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE entity ADD FOREIGN KEY (active_version_id) REFERENCES entityversion(id) ON DELETE SET NULL;
ALTER TABLE entityversion ADD FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE;
我想在创建一个新的活动实体时,同时创建它的第一个实体版本,这将是它的活动版本。问题是我们还没有他们的身份证。目前,我们正在使用“返回 id”创建实体,并使用它来创建 EntityVersion,也使用“返回 id”,然后更新同一实体的 active_version_id,因此例如 3 个单独的命令:
INSERT INTO entity DEFAULT VALUES RETURNING id;
-- get the ID back and use it as a parameter to the next command
INSERT INTO entityversion (entity_id) VALUES (%s) RETURNING id;
-- again the same thing
UPDATE entity SET active_version_id = %s WHERE id = %s;
我想知道是否有更短的方法可以做到这一点。如果碰巧是更好的选择,我也接受表模式的不同方法作为答案。感谢您的帮助!
【问题讨论】:
-
re
ON DELETE SET NULL,您会删除处于活动状态的实体版本的情况是什么? -
您的外键将不起作用,因为您需要彼此在同一本书中。从实体中删除一个并制作一个触发器
-
CREATE TABLE entity将因entityversion不存在而失败。 -
我想在创建一个新实体时,同时创建它的第一个 EntityVersion,这将是它的 active_version。 形式上 - 你可以使用相应的触发器。真的 - 这个自动创建的行的“my data here”必须从哪里获取?
-
@ysth 如果由于某种原因删除了活动版本,我不希望实体被销毁,就是这样。
标签: mysql database-design