0

我正在创建内容之间的多对多关系,但为了简化它,我现在将使用更简单的关系。一个例子是电影之间的关系。存储这些数据的正确方法是什么?

我最初是这样做的:

Movie | Related Movie | Relation (Relation of the related movie)
--------------------------------
Matrix   | Matrix 2 | Sequel
Matrix 2 | Matrix   | Prequel

所以Matrix 2是Matrix的续集,但后来我意识到存储相关电影的关系而不是实际电影的关系似乎没有意义。所以然后我尝试了这个:

Movie | Relation | Related Movie 
--------------------------------
Matrix   | Prequel | Matrix 2
Matrix 2 | Sequel  | Matrix

现在我存储的是电影的实际关系而不是相关的电影,因此该行更有意义。也更直白一点,《黑客帝国》是《黑客帝国2》的前传。

但是,然后我在前端使用第二种方式意识到 Matrix 页面看起来像这样:前传 - Matrix 2

对于 Matrix 2 页面:Sequel - Matrix

所以第一种方式似乎更正确地将数据存储在后端,而不是前端。而第二种方式似乎并没有在后端正确存储数据,但在前端它更有意义。

那么在这种情况下,我是否应该以相反的方式存储数据(第二种方式)?我什至应该担心这一点吗?只要它在前端有意义?

4

1 回答 1

0

您不需要同时存储向后和向前的关系。与链表不同,您不必存储prevandnext指针就可以前后遍历。

例如,为什么不这样做:

SELECT * FROM movies;
+----+---------------+
| id | title         |
+----+---------------+
|  1 | Matrix        |
|  2 | Matrix 2      |
|  3 | The Animatrix |
+----+---------------+

SELECT * FROM movie_relations;
+----+----------+---------------+------------------+
| id | movie_id | relation_type | related_movie_id |
+----+----------+---------------+------------------+
|  1 |        1 | sequel        |                2 |
|  2 |        1 | offshoot      |                3 |
|  3 |        2 | offshoot      |                3 |
+----+----------+---------------+------------------+

现在,如果您需要找到 Matrix 的所有续集:

SELECT related_movie_id FROM movie_relations 
WHERE movie_id = 1 AND relation_type = 'sequel'

如果您需要查找 Matrix 2 的所有前传,您知道这只是以related_movie_id2 作为续集的电影列表:

SELECT movie_id FROM movie_relations 
WHERE related_movie_id = 2 AND relation_type = 'sequel'

假设您需要所有与 Matrix 2 相关的电影(它有一个隐含的前传和一个直接指定的分支):

SELECT DISTINCT(movies.id), title FROM movies 
    LEFT JOIN movie_relations mr_direct ON mr_direct.related_movie_id = movies.id 
    LEFT JOIN movie_relations mr_implicit ON mr_implicit.movie_id = movies.id 
WHERE mr_direct.movie_id = 2 OR mr_implicit.related_movie_id = 2;

+----+---------------+
| id | title         |
+----+---------------+
|  1 | Matrix        |
|  3 | The Animatrix |
+----+---------------+

查询比存储冗余数据稍微复杂一些。但是,我宁愿不要在不必要的地方重复信息。

于 2011-02-06T02:13:08.837 回答