6

映画に関する情報を保存するデータベースを構築しようとしています。

    Title
    Plot
    Genre
    Rating
    Director

私を悩ませている唯一のことは、ほとんどの映画が 1 つのジャンルだけでなく、これを MySQL データベースに保存する方法を見つけるのに苦労していることです。最初は、テーブルを 1 つだけにして、すべてのジャンルを 1 つの列に格納し、カンマで区切って取得したい場合は PHP を使用して区切ることを考えていましたが、これが最善の方法かどうかはわかりません。列に「ホラー、スリラー、アクション」が含まれている場合、ホラーなどの特定のジャンルを並べ替えて検索するのは難しいと思います。

4

4 に答える 4

12

次の構造に従うことをお勧めします。

テーブル名: 映画

movieid、タイトル、あらすじ、評価、監督

> sample data:
> 
> 1 titanic Bollywood   10  James Cameron

テーブル名: ジャンル

ジャンル、ジャンル

> sample data:
>  1    Horror
>  2    Thriller
>  3    Action
>  4    Love

テーブル名: 映画のジャンル

moviegenresid、movieid、genreid

> sample data:
> 1 1   2
> 2 1   4

クエリは次のとおりです。

select m.*,group_concat(g.genre)
from movies m inner join moviegenres mg
on m.movieid=mg.movieid
inner join genres g
on g.genreid=mg.genreid
group by m.movieid
;

フィドルを見る

于 2013-07-05T04:49:03.327 に答える
10

ここでモデル化しようとしているものは、「多対多」の関係と呼ばれ、「実世界」の分類をモデル化する場合に非常に一般的です。

このような関係を処理する方法については、次のような多くの説明があります。

  • あなたの質問に固有のPraveenの答えはこちらです。
  • http://en.wikipedia.org/wiki/Junction_table - 2 つの母集団を多/5 関係でリンクする追加のテーブルは、通常、交差テーブルまたはジャンクション テーブルと呼ばれます。
  • http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.phpは、テーブルとキー/制約の設計の例、明確でない場合の便利なデータ表現図、およびその方法を示しています。関係がモデル化され、アプリケーションで使用されます。
  • 優れたデータベース設計の本/チュートリアルでは、これについてどこかで説明されています。

映画ごとに 1 つのフィールドに複数のジャンルを格納して、追加の交差テーブルをスキップしようとしないでください (たとえば、カンマ区切りのリスト)。これは非常に一般的な「アンチ パターン」であり、今日ではないかもしれませんが、明日ではないかもしれませんが、最終的には問題を引き起こす可能性があります。データベース設計に携わるすべての人に、Bill Karwin の「SQL Antipatterns」( http://pragprog.com/book/bksqla/sql-antipatterns ) を読むことをお勧めします。これは、比較的初心者がアクセスできるように書かれていますが、よりよく知っている必要がある私たちの多くが時々思い出す必要があることを含んでいます (多対多の関係、フィールド内のリストのソリューション/problem と、その代わりに何をすべきかは、この本で最初に取り上げられていることの 1 つです)。

于 2013-07-05T10:57:08.407 に答える