1

我需要将外键存储在不直接引用表的表中。我解释。在这里,我想做一些类似于继承的事情,但实际上并非如此。对于我表中的给定记录,我有两个重要字段:任意通用键,以及一个表示此类键所指类型的字段。这个想法是存储一个整数,然后关于键的类型,加入相应的表。

甚至可能吗?有哪些替代方案?我不想要继承——我没有使用ODBMS

4

2 回答 2

0

Multi-table foreign key如果您放弃创建 FK 约束并将相关的表名存储在另一列中,则可以在一列中(或者更具体地说,“类似于外键的东西”)。除非您关心数据完整性,否则它会以某种方式起作用。事实上,有些人认为这是 SQL 反模式之一。:-)

当然,您可以创建一些触发过程并每次检查“相关”表中是否存在新/修改值。虽然它并不优雅。

我认为更好的方法是在“相关”表中创建外键(每种类型一个表):

main_table:
id
...(other columns)


table_type_first:
main_table_id
foreign_key_for_type_1
...(other columns)


table_type_second:
main_table_id
foreign_key_for_type_2
...(other columns)

它也不是很出色,也许它不是您所需要的(您没有类型列,“实体”类型取决于“类型”表中记录的存在),但它提供了更多的数据完整性。

于 2013-07-09T11:10:32.190 回答
0

“子”表中的外键必须引用单个“父”表。必须在定义密钥时指定父级。子表中的所有行都必须引用同一个父表——不能有逐行区分。

但是请注意,列不需要是外键才能在连接中使用。外键约束将防止将不正确的键插入到子表中,并通过级联到子表或抛出错误来处理父表中的删除。如果您不关心此功能,则可以正常存储“外键”列,并在外部连接中使用它,如下所示:

select *
from child c
left outer join referenced1 r1 on c.fk = r1.pk AND c.code = 'first'
left outer join referenced2 r2 on c.fk = r2.pk AND c.code = 'second'
left outer join referenced3 r3 on c.fk = r3.pk AND c.code = 'third'

上面的示例假定您的“外键”由两列组成 -fk指示您引用的行,以及code指示您想要的表。

于 2013-07-09T10:13:24.473 回答