三重自我参考?

时间:2013-10-23 23:11:04

标签: database database-design entity-relationship self-referencing-table

我不确定3个自我引用是否正确,或者是否有其他方法可以解决这种情况。

我有一个表/实体“Animal”(包含所有类型的基本字段,如id,name,description ...),我想表示特定的动物(例如狗):

“喜欢”一些动物(比方说......龟和奶牛) “讨厌”其他一些动物(猫,鸡) 和其他动物(猪和马)“中性”

我看到建模此架构的唯一可能方式如图所示。 3个关系是多对多(NM)所以我最终创建了3个表来存储动物之间的关系

enter image description here

有一种更好的方式来表示场景吗? 我错过了什么或做错了什么?

1 个答案:

答案 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  |
| .. | ........... |
+----+-------------+