22

私は彼らがデータベースデザインと呼んでいるこの気が遠くなるようなものに頭を悩ませようとしていますが、あまり成功していません。そこで、例を使って私の問題を説明しようと思います。

私はMySQLを使用していますが、ここに私の質問があります。

DVDコレクションを保持するデータベースを作成するとします。含めたい次の情報があります。

  1. 映画のタイトル
  2. 俳優
  3. 実行時間
  4. ジャンル
  5. 説明
  6. 監督

より効率的にするためにこれらの間に関係を作りたいのですが、方法がわかりません。

これが私がデータベース設計について考えていることです:

映画テーブル=>filmid、filmtitle、runningtime、description

年表=>年

ジャンルテーブル=>ジャンル

ディレクターテーブル=>ディレクター

アクターテーブル=>actor_name

しかし、これらのテーブル間に関係を作成するにはどうすればよいでしょうか。

また、自動的にインクリメントする主キーを使用してフィルムテーブルの一意のIDを作成しましたが、テーブルごとに一意のIDを作成する必要がありますか?

そして最後に、PHPフォームを使用して新しい映画をデータベースに更新する場合、このすべてのデータを(関係とすべてを含めて)どのように挿入しますか?

キース、あなたが与えることができるどんな助けにも感謝します

4

10 に答える 10

64

属性とエンティティを区別する必要があります。実体は物であり、通常は名詞です。属性は、情報を説明する部分のようなものです。データベースの専門用語では、エンティティ=テーブル、属性=フィールド/列。

特定のもののために別のテーブルを持っているので、例として、ディレクターを使用してみましょう。これは正規化と呼ばれます。状況によっては良い場合もありますが、他の状況では不要な場合もあります(通常、クエリがより複雑になり、すべてを結合する必要があり、速度が低下します)。

この場合、年自体以外に保存する年に関する属性がないため、年テーブルを作成する必要はありません。これを非正規化し、年をフィルムテーブル自体に保存することをお勧めします。

一方、監督は違います。おそらく、監督の名、姓、生年月日、死亡日(該当する場合)などを保存する必要があります。この人物の映画を入力するたびに、監督の生年月日を入力したくないことは明らかです。指示するので、ディレクター用に別のエンティティを用意するのは理にかなっています。

ディレクターに関するこのすべての情報を保存したくない場合でも(名前だけが必要です)、別のテーブルを用意する(そして代理キーを使用する-すぐにわかります)ので便利です。活版印刷のエラーや重複を防ぎます-誰かの名前のつづりが間違っていたり、入力方法が異なっていたり(最初、最後と最後、最初)、その人が監督した他の映画を見つけようとすると失敗します。

テーブルに代理キー(主キー)を使用することは、一般的に良い考えです。整数の照合は、文字列の照合よりもはるかに高速です。また、他のテーブルに格納されている外部キーを気にすることなく、名前を自由に変更できます(IDは同じままなので、何もする必要はありません)。


あなたは本当にこのデザインをかなり遠くまで持って行くことができます、そしてそれはあなたがそれに何を保存できるようにしたいのかを理解することのすべての問題です。

たとえば、映画ごとに1人の監督がいるのではなく、複数の監督がいる映画もあります。したがって、映画と監督の間には多対多の関係があるため、次のようなテーブルが必要になります。

films_directors => **filmid, directorid**

さらに一歩進んで、時には監督が俳優でもあり、その逆もあります。したがって、ディレクターとアクターのテーブルを作成するのではなく、1人のテーブルを作成し、そのテーブルを結合してロールテーブルを使用することができます。役割テーブルは、さまざまな役職を保持します。たとえば、監督、プロデューサー、スター、エクストラ、グリップ、編集者などです。次のようになります。

films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**

また、film_peopleテーブルにrole_detailsフィールドがある場合があります。このフィールドには、役割に応じて追加情報が含まれる場合があります(たとえば、俳優が演じているパートの名前)。

また、映画には複数のジャンルがある可能性があるため、ジャンルを多くの<>多くの関係として示しています。これが必要ない場合は、film_genreテーブルの代わりに、フィルムにgenreidが含まれるだけです。

これを設定すると、特定の人物が行ったすべてのこと、またはある人物が監督として行ったすべてのこと、映画を監督したことのあるすべての人、または1つの特定の映画に関係するすべての人を簡単に照会して見つけることができます。それは何度も続くことができます。

于 2009-01-29T04:38:41.350 に答える
21

以下は実際のMySQLコードではありません。必要なのは、ここからの概念的なスタートのようです。これが、データベースがどのようになるかを示すモデルです。

アクターテーブル

  • id(主キー)
  • ファーストネーム
  • 苗字
  • など(アクターに保存する追加の列)

ディレクターテーブル

  • id
  • ファーストネーム
  • 苗字

ジャンル表

  • id
  • 名前

フィルムテーブル

  • id
  • タイトル
  • 説明
  • 実行時間
  • 発売日
  • 監督ID-これは、映画を監督した監督のID(主キー)を参照する外部キーです。
  • ジャンルID-監督IDと同様に、これは映画が属するジャンルのIDを指します

俳優-映画インデックステーブル

  • フィルムID-これはフィルムのIDを参照する外部キーです
  • 俳優ID-これは、映画の1人の俳優のIDを参照する外部キーです。

映画の俳優ごとに、Actor-FilmIndexに行を追加します。したがって、俳優5と13(これらの俳優の主キー)が映画4(ここでもその映画の主キー)で主演した場合、インデックスにその事実を反映する2つの行があります。1つは映画ID =4です。俳優ID=5、映画ID = 4、俳優ID=13の別の俳優。

お役に立てば幸いです。

また、これは、各映画に1人の監督がいることを前提としています。ライブラリ内の映画に2人の監督(スラムドッグ$ミリオネアなど)がいる場合は、監督IDを映画テーブルから分離し、上記のようにActor-FilmIndexのようなDirector-Filmインデックスを作成します。

于 2009-01-29T04:34:48.083 に答える
11

これらは私が使用するテーブルです:

films (_id_, title, runningtime, description)
genres (_id_, name)
people (_id_, name, birthdate, etc...)
roles (_roleid_, rolename)
filmgenres (_filmid_, _genreid_)
castandcrew (_filmid_, _roleid_, _personid_)

監督と俳優のテーブルを用意する代わりに、1人のテーブルを用意します。これには、乗組員も含めることができます(2番目のジュニアアシスタントのドリーグリップが誰であるかを追跡したい場合)。各映画は、任意の数のジャンル(たとえば、コメディーやホラー)にすることができます。さらに、人々は各映画でいくつもの役割を演じることができます-そこにはかなりの数の俳優/監督がいます。

Rolesテーブルは、必ずしも俳優が演じているキャラクターを意味するわけではありませんが、それは可能です。「監督」、「プロデューサー」、「俳優」、さらには「ルークスカイウォーカー」など、きめ細かくしたい場合は、IMDBがそうしていると思います。

うまくいけば、上記のフィールドの名前が外部キーを示唆しているはず_underscores_です。私が使用する主キーを囲みました。

于 2009-01-29T04:33:49.427 に答える
4

自動的にインクリメントする主キーを使用してフィルムテーブルの一意のIDを作成しましたが、テーブルごとに一意のIDを作成する必要がありますか?

はい、各テーブルには一意のIDが必要です。ただし、これは必ずしも主要な自動インクリメントキーではありません。特定のインスタンスを一意にするものは何でもです。たとえば、映画の場合、タイトル+リリース年が一般的だと思いますが、それを確認するには、映画ファン(ドメインの専門家)に確認する必要があります。自動インクリメントはフォールバックです。基本的に、他に一意化するものが実際にない場合です。

結合などで使いやすくするために自動インクリメントキーを使用することもできますが、とにかく一意性フィールドに一意の制約を設定する必要があります。

実際のデザインについては、次のような提案をします。

Films => Primary Key(filmid), Unique Constraint(filmtitle, year), 
         runningtime, description, 
         Foreign Key(Genre), Foreign Key(DirectorId)

Genre Table => Primary Key(Genre)

Director Table => Primary Key(DirectorId), DirectorName

Actors Table => Primary Key(ActorId), ActorName

Films_Actors => Primary Key(Foreign Key(ActorId), Foreign Key(FilmId))

挿入物については、まあ-率直に言って、それはPITAです。逆の順序で挿入する必要があります(これは、自動インクリメントキーがさらに大きなPITAになる可能性がある場所です-生年月日などをActors and Directorsテーブルに追加できる場合は、一意の制約によって簡単になります)。

したがって、Actor(s)、Director、Film、Films_Actorsの順に挿入します。理想的には、すべてを1つのトランザクションで実行します。また、ジャンルはすでに入力されており、選択リストであると想定しているため、挿入する必要はありません。

于 2009-01-29T04:34:12.920 に答える
4

Films テーブルには、ジャンル、監督、および俳優テーブルへのリンクも必要です。俳優は少なくとも多対多であるため (1 つの映画に複数の俳優がリストされ、1 人の俳優が複数の映画に出演します)、それらをリンクするためのテーブルが必要になります。

Films Table => filmid, filmtitle, runningtime, description, genreid, directorid
Genre Table => genreid, genre
Director Table => directorid, director
Actors Table => actorid,actor_name
FilmActor link table => actorid, filmid (with a record linking each actor to each film)

多対多になる可能性のあるテーブルには、リンク テーブルが必要です。

于 2009-01-29T04:30:57.937 に答える
2

あなたの質問はすでに回答されていると思いますが、次の URL を参照してください:
http://www.imdb.com/interfaces

IMDB は、データベースのフラットテキスト ファイルを提供します (主キーを除く)。これは、開始したらデータベースにデータを入力するのに役立つ場合があります。また、プログラム/Web サイトで使用して、映画のタイトルを検索して「DVD コレクション」に追加し、残りの情報を取得することもできます。これらから引っ張ってきました。

于 2009-01-29T06:06:42.343 に答える
2

俳優が監督である場合もあれば、その逆の場合もあります。「人物」テーブルが必要ですか?

于 2009-01-29T08:30:50.463 に答える
1

YearTableは実際には必要ありません。必要なのは、filmsテーブルのgenre_id、director_id、およびactor_id列だけです。

また、ジャンル、監督、俳優のテーブルには、独自のIDが必要です。

編集:もちろん、これは、映画ごとに1つのジャンル、監督、俳優しかいないことを前提としています。おそらくそうではありません。

多くの映画に多くの俳優が所属するには、別の関係テーブルが必要になります。これを「moviesActors」(またはactorsMovies)と呼ぶことができ、各行には、この俳優この映画に含まれていたことを示すactor_idとmovie_idがあります。

于 2009-01-29T04:23:48.933 に答える
0

すべてのテーブルには、一意の主キーが必要です。

データベースの正規化についてよく読んでください。

年表はおそらく不要です。

たとえば、リリースの年であれば、その年をフィルムに保存できます。

映画に複数の監督がいる場合は、映画テーブルと監督テーブルの主キーを保持する別のテーブルがあります。同様に、多対1または多対多である外部キー制約のいずれかについて。特に、これは俳優にも当てはまると思います。

于 2009-01-29T04:24:55.530 に答える