这有点模糊,因为文章一直在谈论超类型和子类型,而从未真正说明在数据库中实现继承的可能方式是什么。
但总的来说,文章指出:
会计交易必须由一个或多个借方条目组成,并且必须由一个或多个贷方条目组成。
对我来说,这看起来和听起来像是引用同一个表的两个外键:
create table accounting_transaction (
id integer primary key,
date date not null,
description text
);
create table accounting_entry (
id integer primary key,
amount float not null,
operator text,
credit_id integer references accounting_transaction(id),
debit_id integer references accounting_transaction(id)
);
具有适当的约束条件,以确保文本中所述的条件。但是当然有更好的设计方法。例如:
create table accounting_entry (
id integer primary key,
amount float not null,
operator text,
entry_type integer,
transaction_id integer references accounting_transaction(id)
);
带有显着的entry_type
贷方或借方,以及适当的约束。
编辑:通常,您希望这种 ERD 表示不同类型的关系:从集合到固定数量的组件,这些组件具有相同的类型,但在集合的上下文中具有不同的含义。典型的例子是一个航段,它有一个出发机场和(希望)有一个目的地机场,当然机场就是机场。
create table flight_leg(
id integer primary key,
departure_airport integer references airport(id),
destination_airport integer references airport(id)
);
create table airport(
id integer primary key,
iata_code varchar(3) not null,
name text
);
注意谁引用谁的区别。对于本文中的模型,这意味着 aaccounting_transaction
引用了完全一debit_entry
和完全一credit_entry
,这似乎不是作者的意图。