Sql 如何区分两张桌子之间的距离?

Sql 如何区分两张桌子之间的距离?,sql,postgresql,Sql,Postgresql,我有两张看起来非常相似的桌子: 表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 pos

我有两张看起来非常相似的桌子:

表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
以及:

表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
基本上,只有两个表包含地址,它们用于不同的端口(一个是
Customer
address,另一个是
Supllier
address)

我需要创建一个第三个表,并有一个forigenkey地址。我的问题是forigenkey可以来自
表A
表B

假设模式为:

table_Cid , id , ......
id应该是表a或表B的FK,但这还不够。。。我无法知道它实际上指的是哪一张表

有一句话是:

table_Cid , id , ......
 111         1
哪一行是
1
?是表a的1还是表b的1

如何定义
表c
来处理此问题?
假设对
表a
表b
没有任何更改您可以添加列调用“type”来区分FK\U ID与表a或表b。e、 g:type:1(来自表a)sql是:从fkId=table\U a\U id上的表c join table\U a中选择*,其中type=1将外键引用存储在单独的列中,具体取决于它是针对表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

我认为所有地址都有一个公共表。。。那么你只需要一个FK-问题已解决-我特别写道,我无法更改表A和表B的状态。我知道这种方法,我正在寻找其他方法。使用触发器,FK为你工作,在插入/更新和删除时。我不明白你的意思。像这样的问题表明数据库设计可能有问题。这就是我第一句话想告诉你的。。。