人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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

●質問者: muggy0812
●カテゴリ:ウェブ制作
✍キーワード:E.T. SELECT SF つの ひとつ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●27ポイント

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

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 だけとなり より コンパクトとなります。

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

◎質問者からの返答

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

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


2 ● きゃづみぃ
●27ポイント ベストアンサー

>もう少し具体的に言うと「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両方が出演している映画」という条件の抽出になります。

◎質問者からの返答

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

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

ありがとうございます。

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

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

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


3 ● Banias
●26ポイント

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

ご質問のケースですと、以下のように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
◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ