这个问题的接受答案是非常有用的: How can you represent inheritance in a database?
我真的很喜欢这种他称之为Table Per Type Inheritance:
的解决方案CREATE TABLE policies (
policy_id int,
date_issued datetime,
-- // other common attributes ...
);
CREATE TABLE policy_motor (
policy_id int,
vehicle_reg_no varchar(20),
-- // other attributes specific to motor insurance ...
FOREIGN KEY (policy_id) REFERENCES policies (policy_id)
);
CREATE TABLE policy_property (
policy_id int,
property_address varchar(20),
-- // other attributes specific to property insurance ...
FOREIGN KEY (policy_id) REFERENCES policies (policy_id)
);
但是,我不明白如何做一个选择陈述。在答案的最后他说:
现在搜索所有策略而不管子类型变得非常简单:不需要UNION - 只需要一个SELECT * FROM策略。
这将返回策略中的所有数据,但子类型呢?声明应该是这样的:SELECT * FROM policies INNER JOIN policy_motor ON policies.policy_id=policy_motor.id INNER JOIN policy_property ON policy_property.id=policies.id WHERE date_issued = yesterday
对于我的特殊情况,我有70个子类型。我是否需要内部加入所有70个表格,或者我错过了一些简单的方法来做到这一点?
答案 0 :(得分:1)
首先,它不应该是 SELECT * FROM policies INNER JOIN
反而
SELECT * FROM policies LEFT JOIN
因为在"政策"表包含所有策略,以及子类型表中对它们的引用。
我认为如果您需要子类型,则必须将其作为列添加到策略表中。这样你也知道在哪里查找它。
子表的目的是避免非常长的表,这些表是一半" NULL"价值观。这样,您只需要" Parent"中所需的数据。表。您需要在父表中包含尽可能多的基本类型数据(每个策略都有一个日期开始),并且只需要您需要的数据,该数据特定于子表中的子类型。