我正在重构数据库结构并且有一点问题。 该DB具有相同结构的各种表,如:
人物 - > People_contacts
活动 - > Activities_contacts
现在,我想只创建一个Contact表,并使用ENUM()来区分父项的性质(用于搜索要求和数据可逆性)
结构将是:
人物 - >联系人[人物]
活动 - >联系人[活动]
但现在我需要放一个外键,并根据ENUM属性区分两个不同的表... 我该如何努力呢?有一种方法还是更好地维护旧桌子?
答案 0 :(得分:0)
您不能拥有声明的外键,指向一个表或另一个表,具体取决于字段。 你可以做一些事情,但其中没有一个真的很干净。
但无论如何,可能你被混淆了,你不需要在联系表中有外键。我敢打赌你将始终首先访问人员或活动表,所以你可能可以更改这个表,并添加一个contact_id外键。在联系表中,您只需要添加,如果您还没有,请输入主键,删除de ENUM字段和外键,因为您根本不需要它们
答案 1 :(得分:0)
为什么要使用视图?如果People_contacts
和Activities_contacts
完全相同,您可以尝试:
create view `test` as select *,'People' as Type from `People_contacts` union select *,'Activities' from `Activities _contacts` union;
然后从视图中选择您想要的内容:
select * from `test` where Type = 'People' and .....
,您的查询答案应为此
+----+------+ +--------+
| ID | Data |...| Type |
+----+------+ +--------+
| 1 | foo |...| People |
| 2 | foo |...| People |
+----+------+ +--------+