何时创建子类型或仅使用可选属性

When to create a subtype or simply use optional attributes

我已经使用 Oracle SQL 开发人员练习了一段时间,使用学校作业,在为其中一个做实体关系图时遇到了某种困境,这是我的问题:

在作业中他们提到有一个客户实体具有某些属性,如果这个客户已婚,他们会要求 partners_name,如果没有结婚,他们会要求这个人的 date_of_birth。你会如何处理这种情况?因为有人告诉我“没有正确答案”,但我认为必须有一种标准的或更流行的方法来解决这类情况,我想出了两个选项,我当然会展示。

选项 1: 所以,我想也许我可以将这两个属性都添加到 CLIENT 实体中,并使它们成为可选的,并具有如下内容:

我个人的问题是,当他们明确告诉我如果 CLIENT 已婚则分配 partners_name,如果不是 date_of_birth,这听起来对一个或另一个是强制性的。尽管我刚才说了什么,我还是提到了这个选项,因为我不知道他们是否真的这样做了。

选项 2: 创建子类型,一种用于单身客户,另一种用于非单身客户。

这确实解决了之前的问题,date_of_birth 和 partners_name 现在是强制性的,但是这样做我会再创建两个表吗? (我没有探索 Data Modeler 之外的子类型,所以我不确定这将如何转化为 SQL 开发人员)。


当我完成这项作业时,我选择了选项 1,但直到今天我一直在想选项 2 是否会更好,我确实这么认为,但我担心的是...... 是在这种情况下值得拥有两个额外的实体,例如 MARRIED 和 SINGLE? 这可能意味着两个额外的表,考虑到它们只有一个属性。还有其他我看不到或不知道的选择吗?也许,我真的很想听听比我更了解这个并且比我看到更多案例的人的意见。

注意:我也做了一些研究,比如试图为第二个选项找到 PROS,this is what Oracle has to say about supertypes and subtypes at least. Also found this one,我认为它有点相似,但是不完全是,所以我宁愿提出自己的问题。

谢谢大家的宝贵时间。

Is it worth for this case to have two extra entities such as MARRIED and SINGLE? Which could mean two extra tables

他们不会有任何额外的 table。例如,给定您的对象:

CREATE TYPE client IS OBJECT(
  id         INT,
  first_name VARCHAR2(200),
  last_name  VARCHAR2(200)
) NOT INSTANTIABLE NOT FINAL;

CREATE TYPE single UNDER client (
  date_of_birth DATE
) INSTANTIABLE FINAL;

CREATE TYPE married UNDER client (
  partner_name VARCHAR2(400)
) INSTANTIABLE FINAL;

那你就只有一个了 table:

CREATE TABLE clients OF client(
  id CONSTRAINT clients__id__pk PRIMARY KEY
);

可以存储两种子类型:

INSERT INTO clients VALUES ( SINGLE( 1, 'Alice', 'Adams', DATE '1900-01-01' ) );
INSERT INTO clients VALUES ( MARRIED( 2, 'Betty', 'Baron', 'Bob' ) );

然后:

SELECT c.*,
       TREAT(VALUE(c) AS single).date_of_birth AS date_of_birth,
       TREAT(VALUE(c) AS married).partner_name AS partner_name
FROM   clients c

输出:

ID FIRST_NAME LAST_NAME DATE_OF_BIRTH PARTNER_NAME
1 Alice Adams 1900-01-01 00:00:00
2 Betty Baron Bob

db<>fiddle here