0

コンテンツ間に多対多の関係を作成していますが、単純化するために、ここではより簡単な関係を使用します。例として、映画間の関係があります。このデータを保存する正しい方法は何でしょうか?

私はもともとこれをやっていた:

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

マトリックス 2 はマトリックスの続編ですが、実際の映画の関係ではなく、関連する映画の関係を保存するのは意味がないように思えます。それで、代わりにこれを試しました:

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

現在、関連する映画の代わりに映画の実際の関係を保存しているため、行はより意味があります。また、より文字通り、マトリックスはマトリックス 2 の前日譚です。

しかし、その後、フロント エンドで 2 番目の方法を使用して、マトリックス ページが次のようになることに気付きました: Prequel - Matrix 2

マトリックス 2 ページ: 続編 - マトリックス

したがって、最初の方法はデータをより正確にバックエンドに保存するように見えますが、フロントエンドには保存しません。2 番目の方法は、データをバックエンドに正しく保存していないように見えますが、フロントエンドではより理にかなっています。

この場合、実際にデータを逆に保存する必要がありますか (2 番目の方法)? 私はこれについてまったく心配する必要がありますか?フロントエンドで意味がある限り?

4

1 に答える 1

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'

代わりに、マトリックス2のすべての前日を検索する必要がある場合は、これが単にrelated_movie_id2を続編とする映画のリストであることがわかります。

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

マトリックス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 に答える