设置
因此,一旦您决定使用 STI(单表继承),我发现这是一个相当普遍的场景。
您有一些具有各种子类型的基本类型。
- 人 <(教师、学生、员工等)
- 用户 <(会员、管理员)
- 会员<(买方,卖方)
- 车辆 <(汽车、船、飞机)
- 等等
在数据库中建模有两种主要方法:
- 单表继承
- 一个带有类型字段和一堆可为空字段的大表
- 类表继承
- 每种类型一张桌子,共享 PK(从子代到父代的 FK)
虽然 STI 存在一些问题,但我确实喜欢它如何设法减少您必须进行的连接数量,以及 Rails 等框架中的一些支持,但我遇到了一个关于如何关联的问题子类特定的表。
例如:
- 认证只能参考教师-人员
- 配置文件应仅引用成员用户
- WingInformation 不应与汽车或船相关(除非你可能是蝙蝠侠)
- 广告归卖方会员而非买方会员所有
使用 CTI,这些关系是微不足道的 - 只需在相关表上打一个外键,你就完成了:
ALTER TABLE advertisements
ADD FOREIGN KEY (seller_id) REFERENCES sellers (id)
但是对于 STI,类似的事情不会捕获子类型限制。
ALTER TABLE advertisements
ADD FOREIGN KEY (seller_id) REFERENCES members (id)
我想看到的是这样的:
* Does not work in most (all?) databases *
ALTER TABLE advertisements
ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type)
我所能找到的只是一个肮脏的黑客,需要向相关表添加一个计算列:
ALTER TABLE advertisements
ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller'
ALTER TABLE advertisements
FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type)
这让我觉得很奇怪(更不用说不雅了)。
真正的问题
那里有一个 RDBMS 可以让我这样做吗?
有没有理由为什么这甚至不可能?
这只是除了在最微不足道的情况下不使用 STI 的另一个原因吗?