下記のような場合のデーブルの設計について教えてください。


・管理するデータは映画情報
・複数条件で検索するのに、適した構造にしたい

映画ですと、監督、出演者、ジャンルなど、色々な属性がありますが、
それを単純にひとつのテーブルで管理しようとすると下記のようになります

title | kantoku | cast | genre
─────────────────────────
e.t. | Steven Spielberg | Mary,Elliott | SF

上の例の「cast」の部分に人名が2名分入っています。
これだとselectでデータを取得する際にlikeなどを使う必要がでて
あまり効率のよい取得ができないように思います。

そこで、このような一つの項目に対して、複数のデータがある場合の
効率的なテーブル設計は、どのようなものでしょうか
※例で言う「cast」のような項目が複数あっても、対応できる設計。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/05/21 16:26:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

>もう少し具体的に言うと「maryとelliott両方が出演している映画」という条件で抽出したい場合などです。

検索の仕方の考え方として説明します。

まず maryで抽出します。

そうすると たとえば

cinema_no | cast

1 | mary

2 | mary

3 | mary

となったとします。

もとのテーブルの場合は

e.t. | Steven Spielberg | Mary| SF

映画A | 監督A | Mary| A

映画B | 監督B | Mary| B


次に elliottで抽出します。

cinema_no | cast

2 | elliott

3 | elliott

4 | elliott

もとのテーブルの場合は

e.t. | Steven Spielberg | elliott | SF

映画B | 監督B | elliott | B

映画C | 監督C | elliott | C

それぞれ抽出したものを 仮想のテーブルとして扱い、両方のテーブルでキーが一致するものを 抽出すれば「maryとelliott両方が出演している映画」という条件の抽出になります。

id:muggy0812

仮想テーブル、使ったことがないので参考になりました。

きっとビューと呼ばれているものですね。この機会に試してみようと思います。

ありがとうございます。

そこでまた疑問なのですが、mary,elliottそれぞれの条件でレコードを取得したあと

2つの仮想テーブルができますが、その2つをINNER JOINで結合する...ということでしょうか。

また、今回指定したcastのような、複数の条件を指定したい項目がさらにあった場合はどう対応しますか?

2011/05/21 10:13:46

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

一つの項目に対して 複数ある場合は 複数レコードになるだけです。

e.t. | Steven Spielberg | Mary,Elliott | SF

このレコードでしたら

e.t. | Steven Spielberg | Mary| SF

e.t. | Steven Spielberg | Elliott | SF

このようにしておけば

e.t. | Steven Spielberg | Mary| SF

別の映画 | Steven Spielberg | Mary| SF

というように Maryだけで検索したら 出演したものすべて 取得できます。

もちろん 重複した内容を持つことになりますから それだけ データベースも肥大するでしょうけど

これぐらいでしたら たいしたサイズでは ないです。

もう少し 重複を少なくするならば

映画のテーブルとCASTのテーブルを作ればいいでしょう。

cinema_no | title | kantoku | genre

これが 映画テーブル

映画の情報は CASTが 変わろうと固定ですからね。

それで CASTテーブル

cinema_no | cast

こうすれば 重複するのは cinema_no だけとなり より コンパクトとなります。

こちらのほうが 一般的ですね。

id:muggy0812

上記のように、複数レコードにした場合、映画を検索する条件として、2名のCASTを指定する場合はどのようにしますか?

もう少し具体的に言うと「maryとelliott両方が出演している映画」という条件で抽出したい場合などです。

2011/05/21 09:11:05
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198ここでベストアンサー

ポイント27pt

>もう少し具体的に言うと「maryとelliott両方が出演している映画」という条件で抽出したい場合などです。

検索の仕方の考え方として説明します。

まず maryで抽出します。

そうすると たとえば

cinema_no | cast

1 | mary

2 | mary

3 | mary

となったとします。

もとのテーブルの場合は

e.t. | Steven Spielberg | Mary| SF

映画A | 監督A | Mary| A

映画B | 監督B | Mary| B


次に elliottで抽出します。

cinema_no | cast

2 | elliott

3 | elliott

4 | elliott

もとのテーブルの場合は

e.t. | Steven Spielberg | elliott | SF

映画B | 監督B | elliott | B

映画C | 監督C | elliott | C

それぞれ抽出したものを 仮想のテーブルとして扱い、両方のテーブルでキーが一致するものを 抽出すれば「maryとelliott両方が出演している映画」という条件の抽出になります。

id:muggy0812

仮想テーブル、使ったことがないので参考になりました。

きっとビューと呼ばれているものですね。この機会に試してみようと思います。

ありがとうございます。

そこでまた疑問なのですが、mary,elliottそれぞれの条件でレコードを取得したあと

2つの仮想テーブルができますが、その2つをINNER JOINで結合する...ということでしょうか。

また、今回指定したcastのような、複数の条件を指定したい項目がさらにあった場合はどう対応しますか?

2011/05/21 10:13:46
id:Banias No.3

回答回数237ベストアンサー獲得回数19

ポイント26pt

テーブルを複数に分けて正規化することが定石です。

ご質問のケースですと、以下のように4つのテーブルに分けます。

ID title kantokuID genreID
001 e.t. 001 001

genreID genre
001 SF

kantokuID kantoku
001 Steven Spielberg

ID cast
001 Mary
001 Elliott
id:muggy0812

正規化したテーブル郡からどのようなクエリでデータを取得しますか?

例えば複数のキャストと、複数のジャンルを同時に条件を指定してレコードを取得したい場合など。

2011/05/21 12:26:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません