我不确定3个自我引用是否正确,或者是否有其他方法可以解决这种情况。
我有一个表/实体“Animal”(包含所有类型的基本字段,如id,name,description ...),我想表示特定的动物(例如狗):
“喜欢”一些动物(比方说......龟和奶牛) “讨厌”其他一些动物(猫,鸡) 和其他动物(猪和马)“中性”
我看到建模此架构的唯一可能方式如图所示。 3个关系是多对多(NM)所以我最终创建了3个表来存储动物之间的关系
有一种更好的方式来表示场景吗? 我错过了什么或做错了什么?
答案 0 :(得分:3)
您可以按照我在下面描述的方式对其进行建模,只需要三张桌子就可以让您拥有像“狗讨厌猫”但“猫爱狗”这样的条件。
animals
id unsigned int(P)
name varchar(10)
+----+----------+
| id | name |
+----+----------+
| 1 | dog |
| 2 | cat |
| 3 | cow |
| 4 | tortoise |
| 5 | chicken |
| 6 | pig |
| 7 | horse |
| .. | ........ |
+----+----------+
animals_feelings
id unsigned int(P)
source_id unsigned int(F animals.id)
feeling_id unsigned int(F feelings.id)
target_id unsigned int(F animals.id)
+----+-----------+------------+-----------+
| id | source_id | feeling_id | target_id |
+----+-----------+------------+-----------+
| 1 | 1 | 2 | 2 |
| 2 | 1 | 1 | 3 |
| 3 | 1 | 1 | 4 |
| 4 | 1 | 3 | 6 |
| 5 | 1 | 3 | 7 |
| .. | ......... | .......... | ......... |
+----+-----------+------------+-----------+
feelings
id unsigned int(P)
description varchar(10)
+----+-------------+
| id | description |
+----+-------------+
| 1 | loves |
| 2 | hates |
| 3 | is neutral |
| .. | ........... |
+----+-------------+