・管理するデータは映画情報
・複数条件で検索するのに、適した構造にしたい
映画ですと、監督、出演者、ジャンルなど、色々な属性がありますが、
それを単純にひとつのテーブルで管理しようとすると下記のようになります
title | kantoku | cast | genre
─────────────────────────
e.t. | Steven Spielberg | Mary,Elliott | SF
上の例の「cast」の部分に人名が2名分入っています。
これだとselectでデータを取得する際にlikeなどを使う必要がでて
あまり効率のよい取得ができないように思います。
そこで、このような一つの項目に対して、複数のデータがある場合の
効率的なテーブル設計は、どのようなものでしょうか
※例で言う「cast」のような項目が複数あっても、対応できる設計。
>もう少し具体的に言うと「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両方が出演している映画」という条件の抽出になります。
一つの項目に対して 複数ある場合は 複数レコードになるだけです。
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両方が出演している映画」という条件で抽出したい場合などです。
>もう少し具体的に言うと「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のような、複数の条件を指定したい項目がさらにあった場合はどう対応しますか?
テーブルを複数に分けて正規化することが定石です。
ご質問のケースですと、以下のように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 |
正規化したテーブル郡からどのようなクエリでデータを取得しますか?
例えば複数のキャストと、複数のジャンルを同時に条件を指定してレコードを取得したい場合など。
仮想テーブル、使ったことがないので参考になりました。
きっとビューと呼ばれているものですね。この機会に試してみようと思います。
ありがとうございます。
そこでまた疑問なのですが、mary,elliottそれぞれの条件でレコードを取得したあと
2つの仮想テーブルができますが、その2つをINNER JOINで結合する...ということでしょうか。
また、今回指定したcastのような、複数の条件を指定したい項目がさらにあった場合はどう対応しますか?