定义关系型数据库表的时候,遇到一个疑问:
Node表 {
id: number,
label: string
}
Comb表 {
id: number,
label: string
}
Link表 {
source: // 这里可以是Node表的实例也可以是Comb表的实例
target: // 这里可以是Node表的实例也可以是Comb表的实例
}
请问,我们在定义Link表的时候,是否是只能定义为4个字段?
Link表 {
nodesource: Node,
nodetarget: Node,
combsource: Comb,
combtarget: Comb,
}
你的需求是让 Link 表中的 source 和 target 字段能够引用 Node 表或 Comb 表的实例。直接定义为四个字段虽然可以实现,但并不是最优雅的解决方案。
使用单表继承(Single Table Inheritance, STI) 或多表继承(Class Table Inheritance, CTI) 来处理这种情况。
单表继承(STI)
你可以创建一个通用的 Entity 表,然后让 Node 和 Comb 表继承自 Entity 表。这样,Link 表只需要引用 Entity 表即可。
在这种设计中,Node 和 Comb 表的数据都存储在 Entity 表中,通过 type 字段区分。
多表继承(CTI)
你可以创建一个 Link 表,其中 source 和 target 字段分别引用 Node 和 Comb 表的主键。
在这种设计中,你需要确定 source_node_id 和 source_comb_id 以及 target_node_id 和 target_comb_id 之间的约束关系,以避免数据不一致。