多个表的外键

时间:2013-12-03 17:59:59

标签: mysql foreign-keys innodb polymorphic-associations

我正在重构数据库结构并且有一点问题。 该DB具有相同结构的各种表,如:

人物 - > People_contacts

活动 - > Activities_contacts

现在,我想只创建一个Contact表,并使用ENUM()来区分父项的性质(用于搜索要求和数据可逆性)

结构将是:

人物 - >联系人[人物]

活动 - >联系人[活动]

但现在我需要放一个外键,并根据ENUM属性区分两个不同的表... 我该如何努力呢?有一种方法还是更好地维护旧桌子?

2 个答案:

答案 0 :(得分:0)

您不能拥有声明的外键,指向一个表或另一个表,具体取决于字段。 你可以做一些事情,但其中没有一个真的很干净。

  1. 您可以使用整数字段和枚举,但不要将该字段声明为外键。您必须自己实现所有逻辑,并且难以维护,并且更难将数据库与编程分离。
  2. 您可以拥有2个可以为空的外键(people_id和activity_id),并忘记枚举字段。如果一个FK为空,另一个将具有真实关系。这是更好的,因为您像往常一样声明外键并且模型更强大
  3. 如果您希望保持联系表清洁,可以使用关系表放置这些脏东西。因此,在此表中,您存储了contact_id,以及活动或人员的ID,如1或2中所述
  4. 但无论如何,可能你被混淆了,你不需要在联系表中有外键。我敢打赌你将始终首先访问人员或活动表,所以你可能可以更改这个表,并添加一个contact_id外键。在联系表中,您只需要添加,如果您还没有,请输入主键,删除de ENUM字段和外键,因为您根本不需要它们

答案 1 :(得分:0)

为什么要使用视图?如果People_contactsActivities_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 |
+----+------+   +--------+