我有两张看起来非常相似的表:
Table A
:
table_c_id address country status defaultA deafultB
1 480 st 4 170 True False
2 271 st 4 150 False False
3 174 St post 44 3 150 False False
和
Table B
:
table_b_id address country isdefault canoverwrite linked
1 12 True False 33
48 Kyat St. 17 True
155 Rover St 17 True 14
基本上它只是两个包含地址的表,它们用于不同的porupses(假设一个是Customer
地址,另一个是Supllier
地址)
我需要创建第3个表并且具有forigenkey的地址。我的问题是forigenkey可以来自table A
或table B
。
说模式是:
table_Cid , id , ......
id应该是Table_A或Table_B的FK,但这还不够......我将无法知道它实际上指的是哪一个表。
说一行是:
table_Cid , id , ......
111 1
哪一行1
是?是table_a的1还是table_b的1?
如何定义table_c
来处理此问题?
假设table_a
和table_b
无法进行任何更改。
答案 0 :(得分:0)
您可以添加列调用'type'以区分FK_ID与table_a或table_b。例如:type:1(来自table_a)sql是:select * from table_c join table_a on fkId = table_a_id where type = 1
答案 1 :(得分:0)
将外键引用存储在单独的列中,具体取决于它是表A还是表B.确保只设置其中一个:
create table c (id integer,
...
a_fk integer references A (id),
b_fk integer references B (id),
...
check (a_fk is null or b_fk is null))
创建一个返回当前FK列的视图,并指示其是否为表A或表B:
create view cv as select id, ...
coalesce(a_fk, b_fk) as fk_val,
case when a_fk is not null then 'A'
when b_fk is not null then 'B'
end as fk_tbl,
...
from c