我正在创建内容之间的多对多关系,但为了简化它,我现在将使用更简单的关系。一个例子是电影之间的关系。存储这些数据的正确方法是什么?
我原本是这样做的:
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
现在我正在存储电影的实际关系而不是相关的电影,所以这行更有意义。它也更直观,Matrix是Matrix 2的前传。
然而,我在前端使用第二种方式实现了它对于Matrix页面看起来像这样: 前传 - 矩阵2
对于Matrix 2页面: 续集 - 矩阵
所以第一种方式似乎是在后端更正确地存储数据,而不是前端。而第二种方式似乎并没有在后端正确存储数据,但在前端它更有意义。
所以在这种情况下,我是否应该以相反的方式存储数据(第二种方式)?我是否应该特别关注这个?只要它在前端有意义吗?
答案 0 :(得分:0)
您无需存储向后和向后关系。与链接列表不同,您不必存储prev
和next
指针,以便能够向后和向前遍历。
例如,为什么不这样做:
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_id
2作为续集的电影列表:
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 |
+----+---------------+
查询 比存储冗余数据稍微复杂一些。但是,我更愿意在没有必要的地方重复信息。