2016-12-19 13 views
2

私は、映画、監督、カメラオペレーター、作曲家、スコアなどのデータベースを設定しています。適切なDB設定 - 結合が多すぎますか?

ここで、各ムービーにタイトル、説明などの行があります。ディレクター、作曲家など。

私はフィルムテーブルのすべての行にディレクターの名前を繰り返したくないので、私は異なるテーブルに作曲家を置いています。私はその後、ディレクターのデータへの外部キーで参照するフィルムのテーブルで

、作曲など

映画のすべてのデータを取得するには、私は一緒にすべてのテーブルを結合ビューを作成します1つのMySQLクエリが私に映画の人間が読める情報を与えるようにします。

これは良い方法ですか?または、いくつかの左の結合は良い考えではありませんか?

ビューは、この(kindofが)のようになります

SELECT `movies`.`title` as `title`, `movies`.`description` as [...], 
`directors`.`name` as `name` [...], `composers`.`name` as `cname` [...] 
from 
    `movies` 
left join 
    `directors` on `movies`.`directors_id`=`directors`.`id` 
left join 
    `movies`.`musicians_id` = `musicians`.`id` [...] 

それはそれを行うための効率的な方法でしょうか?

+3

あなたのメソッドは*正規化*と呼ばれ、データを保存するのに適しています。 –

+0

あなたのアプローチは完璧です。必要に応じて、LEFT JOINをINNER JOINと置き換えることができます(たとえば、すべての移動にディレクターがあると思います)。 –

+0

私はまだ内側と左側の結合の違いを理解していません(そして、私は円で絵を知っています。迅速な回答ありがとう! –

答えて

0

Gordon Linoffさんがコメントしたように、これは正規化と呼ばれ、一般にはデータを保存するのに適しています。

テーブルを定義するには、必ずLEFT結合が必要です。 LEFTジョインがINNER JOINに置き換えられた場合、ミュージシャンがいない、またはディレクターがいないムービーの場合、結果に行がありません。

しかし、提案されている正規化では、映画業界のさまざまなクリエイティブの役割のテーブルが多数作成されます。オスカーやその他の賞がある主要なクリエイティブな役割をカバーするためにも、10以上のテーブルが必要です。

これを避ける一般的な方法は、映画用の単一のテーブルとクリエイティブ用の単一のテーブルを持つことです。 3つ目のテーブルは、2つのロールを異なるロールで接続するために使用されます。例:

TABLE CREATIVE_ROLES_LINK (LIKN_ID INT, MOVIE_ID INT, ROLE_NAME VARCHAR(30), PERSON_ID INT); 

上記は基本的な考え方を示しています。実際には、他のテーブルに格納されているROLE_NAMEを使用すると、さらに多くの正規化を行うことができます。

+0

"一般的に正規化はデータを保存するのに適しています" - ここには控えめな表現があります! – onedaywhen

+0

SQLテーブルのように、ドキュメントおよびキー値データベースにデータが格納される可能性がある場合、「控えめな」表現ではありません。 – fredt

関連する問題