在一个 table 中创建条目时,要求恰好在对应的 table 之一中创建条目
When creating entry in one table, require creating entry in exactly one of corresponding tables
假设我有一个 table A
,它被认为是 table 到 table B1
的“超类”, B2
, ..., Bn
.
这种关系是分离的和完整的。也就是说,每次在tableA
中创建一个条目,则必须在tableB1
、B2
中恰好创建一个对应的条目, ..., Bn
.
请注意,B1
、...、Bn
中的每个条目都有一个外键到其在 A
中对应的条目。
我的问题是如何在 MySQL 中执行此操作。
我的潜在想法是在 table A
中有一个 ENUM
列(我们称之为 subclass
),对应于要创建的子类 table .然后,会在以下情况下激活触发器:
- 条目被插入 table
A
。
- 一个或多个条目的 ID 属性在 table
A
中被修改。
- 一个或多个条目的
subclass
属性在 table A
中被修改。
激活触发器后,根据 subclass
的值,提示用户在 B1
、[=13= 中的相应 table 中创建条目], ..., Bn
.
我会提供一个示例,但我什至发现用户如何在 tables B1
、table 之一中指定插入条目中的值时遇到了很多麻烦=13=], ..., Bn
。由于这个问题,我不确定使用触发器是否可以解决这个问题。
编辑:这个问题不是this question的重复问题,因为问题和答案都没有讨论问题中提到的主要问题。也就是说,每次在 table A 中创建一个条目时,必须在 table 的“子类”之一中创建相应的条目 B1, ..., Bn
编辑 2:在我的特殊情况下,有一个 patient
table,它有“子类”tables adult_patient
和 child_patient
.
patient
table 包含 adult_patient
和 child_patient
都具有的所有属性,例如名字、姓氏、出生日期等
adult_patient
table 有一些自己的属性,如 primary_phone
和 primary_email
。 child_patient
table 与 guardian
table 的链接,其中每个 guardian
行包含 primary_phone
、primary_email
等
您可以将 n 个外键放入每个引用 bn
的 a
中。在检查约束中,检查其中一个不是 NULL
。这强制要求恰好一个 bi
中的相应记录必须存在。
CREATE TABLE b1
(id integer,
PRIMARY KEY (id));
CREATE TABLE b2
(id integer,
PRIMARY KEY (id));
CREATE TABLE b3
(id integer,
PRIMARY KEY (id));
...
CREATE TABLE a
(id integer,
b1 integer,
b2 integer,
b3 integer,
...
PRIMARY KEY (id),
FOREIGN KEY (b1)
REFERENCES b1
(id),
FOREIGN KEY (b2)
REFERENCES b2
(id)
FOREIGN KEY (b3)
REFERENCES b3
(id),
...
CHECK (b1 IS NOT NULL
AND b2 IS NULL
AND b3 IS NULL
...
OR b1 IS NULL
AND b2 IS NOT NULL
AND b3 IS NULL
...
OR b1 IS NULL
AND b2 IS NULL
AND b3 IS NOT NULL
...));
方案A:
删除 FOREIGN KEY
约束条件。在需要的地方用 INDEXes
替换它们。
FK 是动态检查约束和进行约束检查的索引两件事'fast'。 Sub-classing 对约束检查不友好。
B计划:
不要尝试在 SQL 中使用“sub-classing”。太乱了[通常]不值得做。
如果您提供实际的 table 和列名,我们或许可以帮助您重新设计架构。
方案C:
将所有“患者”信息合并为一个 table。 “成人”和“child”之间似乎没有足够的区别来保证 sub-classing.
的麻烦
- 在没有值的地方使用 NULL。
- 对于老人来说,“监护人”变成了“看护人”。
- 即使是“child”也可以有一个首选phone——达到parent。也就是说,我会把它复制到这个 table 中。打电话时,说“我打电话是关于“John Doe”的——这让 parent/caretaker 了解发生了什么。
假设我有一个 table A
,它被认为是 table 到 table B1
的“超类”, B2
, ..., Bn
.
这种关系是分离的和完整的。也就是说,每次在tableA
中创建一个条目,则必须在tableB1
、B2
中恰好创建一个对应的条目, ..., Bn
.
请注意,B1
、...、Bn
中的每个条目都有一个外键到其在 A
中对应的条目。
我的问题是如何在 MySQL 中执行此操作。
我的潜在想法是在 table A
中有一个 ENUM
列(我们称之为 subclass
),对应于要创建的子类 table .然后,会在以下情况下激活触发器:
- 条目被插入 table
A
。 - 一个或多个条目的 ID 属性在 table
A
中被修改。 - 一个或多个条目的
subclass
属性在 tableA
中被修改。
激活触发器后,根据 subclass
的值,提示用户在 B1
、[=13= 中的相应 table 中创建条目], ..., Bn
.
我会提供一个示例,但我什至发现用户如何在 tables B1
、table 之一中指定插入条目中的值时遇到了很多麻烦=13=], ..., Bn
。由于这个问题,我不确定使用触发器是否可以解决这个问题。
编辑:这个问题不是this question的重复问题,因为问题和答案都没有讨论问题中提到的主要问题。也就是说,每次在 table A 中创建一个条目时,必须在 table 的“子类”之一中创建相应的条目 B1, ..., Bn
编辑 2:在我的特殊情况下,有一个 patient
table,它有“子类”tables adult_patient
和 child_patient
.
patient
table 包含 adult_patient
和 child_patient
都具有的所有属性,例如名字、姓氏、出生日期等
adult_patient
table 有一些自己的属性,如 primary_phone
和 primary_email
。 child_patient
table 与 guardian
table 的链接,其中每个 guardian
行包含 primary_phone
、primary_email
等
您可以将 n 个外键放入每个引用 bn
的 a
中。在检查约束中,检查其中一个不是 NULL
。这强制要求恰好一个 bi
中的相应记录必须存在。
CREATE TABLE b1
(id integer,
PRIMARY KEY (id));
CREATE TABLE b2
(id integer,
PRIMARY KEY (id));
CREATE TABLE b3
(id integer,
PRIMARY KEY (id));
...
CREATE TABLE a
(id integer,
b1 integer,
b2 integer,
b3 integer,
...
PRIMARY KEY (id),
FOREIGN KEY (b1)
REFERENCES b1
(id),
FOREIGN KEY (b2)
REFERENCES b2
(id)
FOREIGN KEY (b3)
REFERENCES b3
(id),
...
CHECK (b1 IS NOT NULL
AND b2 IS NULL
AND b3 IS NULL
...
OR b1 IS NULL
AND b2 IS NOT NULL
AND b3 IS NULL
...
OR b1 IS NULL
AND b2 IS NULL
AND b3 IS NOT NULL
...));
方案A:
删除 FOREIGN KEY
约束条件。在需要的地方用 INDEXes
替换它们。
FK 是动态检查约束和进行约束检查的索引两件事'fast'。 Sub-classing 对约束检查不友好。
B计划:
不要尝试在 SQL 中使用“sub-classing”。太乱了[通常]不值得做。
如果您提供实际的 table 和列名,我们或许可以帮助您重新设计架构。
方案C:
将所有“患者”信息合并为一个 table。 “成人”和“child”之间似乎没有足够的区别来保证 sub-classing.
的麻烦- 在没有值的地方使用 NULL。
- 对于老人来说,“监护人”变成了“看护人”。
- 即使是“child”也可以有一个首选phone——达到parent。也就是说,我会把它复制到这个 table 中。打电话时,说“我打电话是关于“John Doe”的——这让 parent/caretaker 了解发生了什么。