Frage

sie nennen Datenbank-Design ohne viel Erfolg

Ich versuche, meinen Kopf um dieses umwerfend Zeug zu bekommen, also werde ich versuchen, mein Problem mit einem Beispiel zu illustrieren.

Ich bin mit MySQL und hier ist meine Frage:

Sagen, dass ich eine Datenbank erstellen möchte, dass meine DVD-Sammlung zu halten. Ich habe folgende Informationen, die ich mag gehören:

  1. Filmtitel
  2. Schauspieler
  3. Laufzeit
  4. Genre
  5. Beschreibung
  6. Jahr
  7. Direktor

Ich möchte die Beziehungen zwischen diesen schaffen, ist es effizienter zu machen, aber nicht wissen, wie.

Hier ist, was ich denke für das Datenbank-Design:

Filme Table => FilmID, filmtitle, runningtime, Beschreibung

Jahr Table => Jahr

Genre Table => Genre

Director Table => Direktor

Schauspieler Table => actor_name

Aber wie würde ich mich über die Beziehungen zwischen diesen Tabellen erstellen?

Außerdem habe ich eine eindeutige ID für die Filme der Tabelle mit einem Primärschlüssel erstellt, die automatisch erhöht, muss ich eine eindeutige ID für jede Tabelle erstellen?

Und schließlich, wenn ich einen neuen Film in die Datenbank über ein PHP-Formular zu aktualisieren wäre, wie würde ich füge all diese Daten in (mit den Beziehungen und alle?)

Vielen Dank für jede Hilfe, die Sie geben können, Keith

War es hilfreich?

Lösung

Sie haben eine Unterscheidung zwischen Attributen und Organisationen zu machen. Ein Unternehmen ist eine Sache - in der Regel ein Substantiv. Ein Attribut ist mehr wie ein Stück beschreibender Information. Im Datenbank-Jargon, entity = Tabelle, attribute = Feld / Spalte.

eine separate Tabelle für bestimmte Dinge zu haben, lassen Sie sich Direktor verwenden, als Beispiel wird Normalisieren bezeichnet. Während es in einigen Fällen gut sein kann, kann es in anderen nicht notwendig sein (wie im Allgemeinen macht es komplizierte Anfragen - Sie haben alles zu verbinden - und es ist langsamer).

In diesem Fall ist ein Jahr Tabelle mit unnötig, da es keine anderen Attribute über ein Jahr sind, außer dem Jahr selbst, dass Sie speichern würden. Es ist besser, dies denormalize und speichert das Jahr, in dem Film Tabelle selbst.

Director, auf der anderen Seite, ist anders. Vielleicht möchten Sie den Regie Vorname, Nachname speichern, Geburtsdatum, Sterbedatum (falls zutreffend) usw. offensichtlich Sie wollen nicht, der Direktor des Geburtsdatums, dass diese Person jedes Mal, wenn Sie einen Film eingeben eingeben lenkt, so macht es Sinn, eine separate Einheit für einen Regisseur zu haben.

Auch wenn Sie wollen nicht all diese Informationen über den Regisseur speichern (Sie wollen ihre Namen nur), denn es ist eine separate Tabelle mit (und einen Ersatzschlüssel - ich werde in einem zweiten dazu komme) ist nützlich, weil es typographische Fehler und Dubletten verhindert - wenn Sie jemand den Namen falsch geschrieben haben oder anders eingegeben (erste, letzte vs letzte zuerst), dann, wenn Sie andere Filme zu finden, versuchen sie gerichtet haben, werden Sie scheitern.

einen Ersatzschlüssel verwenden (Primärschlüssel) für Tabellen ist in der Regel eine gute Idee. eine ganze Zahl passender ist viel schneller als ein String-Matching. Es erlaubt Ihnen auch frei, den Namen zu ändern, ohne sich Gedanken über die ausländischen in anderen Tabellen gespeicherten Schlüssel (die ID gleich bleibt, so dass Sie haben nichts zu tun).


Sie können wirklich diesen Entwurf nehmen ziemlich weit, und es ist alles eine Frage der herauszufinden, was Sie darin zu speichern, um der Lage sein möchten.

Zum Beispiel, anstatt eine einzige Regisseur pro Film haben, einige Filme mehrere Direktoren haben .. so gäbe es eine viele-zu-viele-Beziehung zwischen den Filmen und Regisseuren, so dass Sie würde eine Tabelle mit zB müssen:

films_directors => **filmid, directorid**

es einen Schritt weiter, manchmal sind Direktoren auch Schauspieler, und umgekehrt. Anstatt also auch Tabellen Regisseur und Schauspieler haben, können Sie eine einzelne Person Tisch haben, und dass die Join-Tabelle in eine Rolle Tabelle. Die Rolle Tabelle würde verschiedene Positionen halten - zum Beispiel Regisseur, Produzent, Stern, extra, Griff, Redakteur .. und es würde aussehen wie:

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

Sie können auch ein role_details Feld in der film_people Tabelle haben, die über die Rolle (zB der Name des Teils der Schauspieler spielt), je zusätzliche Informationen enthalten könnten.

Ich zeige auch Genre als viele <> Beziehung, weil möglich, einen Film in mehrere Genres ist. Wenn Sie dies nicht wollte, dann anstelle der film_genre Tabelle würde Filme enthalten nur einen GenreID.

Sobald dies eingerichtet ist, ist es einfach alles, was eine bestimmte Person abzufragen und finden getan hat, oder alles, was eine Person als Regisseur getan, oder jeder, der schon einmal einen Film gerichtet hat, oder alle Personen mit einer spezifischen beteiligten Film .. Es kann weiter und weiter gehen.

Andere Tipps

Was folgt, ist nicht unbedingt die MySQL-Code. Es scheint so, was Sie brauchen mehr von einem konzeptuellen Start ist hier. Also hier ist ein Modell, was Ihre Datenbank aussehen sollte.

Schauspieler Tabelle

  • id (Primärschlüssel)
  • Vorname
  • Nachname
  • usw. (Zusätzliche Spalten wollen Sie sich auf einen Schauspieler speichern)

Director Tabelle

  • id
  • Vorname
  • Nachname
  • etc.

Genre Tabelle

  • id
  • name
  • etc.

Film Tabelle

  • id
  • title
  • Beschreibung
  • Laufzeit
  • Release-Datum
  • Direktor id - dies ist ein Fremdschlüssel, der auf die ID (Primärschlüssel) des Regisseurs verweist, die den Film gerichtet
  • Genre id - wie der Regisseur id, bezieht sich dies auf die ID des Genres der Film gehört

Schauspieler-Film-Indextabelle

  • Film-ID - das ist ein Fremdschlüssel, der auf die ID des Films bezieht sich
  • Schauspieler id -. Das ist ein Fremdschlüssel, der in dem Film auf die ID eines Akteurs verweist

Für jeden Schauspieler in dem Film würden Sie eine Reihe zum Schauspieler-Film-Index hinzuzufügen. Also, wenn Akteure 5 und 13 (die Primärschlüssel für die Akteure) in Film spielen 4 (wieder der Primärschlüssel für diesen Film), dann würden Sie zwei Zeilen reflektieren diese Tatsache in Ihrem Index: Ein mit Film-ID = 4, und Schauspieler id = 5, und zum anderen mit Film-ID = 4, und Schauspieler id = 13.

Ich hoffe, das hilft.

Auch setzt dies voraus, dass jeder Film genau einen Regisseur hat. Wenn jeder Film in Ihrer Bibliothek hat zwei Direktoren (wie Slumdog Millionaire), dann würden Sie den Direktor-ID aus dem Film Tabelle trennen wollen, und erstellen Sie einen Director-Film Index wie der Schauspieler-Film-Index wie oben.

Dies sind die Tabellen I verwenden würde:

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

Statt eine Regisseur und Schauspieler Tisch zu haben, haben sie nur eine Tabelle von Menschen. Dies kann auch Besatzungsmitglieder sind (falls Sie möchten, wer der zweite Junior Assistent Dolly Grip verfolgen war). Jeder Film kann eine beliebige Anzahl von Genres sein (Komödie und Horror, zum Beispiel). Darüber hinaus können die Menschen auf jeder Film eine beliebige Anzahl von Rollen übernehmen -. Gibt es eine ganze Reihe von Schauspieler / Regisseure gibt

Die Tabelle Rollen bedeutet nicht unbedingt den Charakter der Schauspieler zu spielen, aber es könnte. Es könnte „Direktor“, „Producer“, „Schauspieler“ ... oder auch „Luke Skywalker“ sein, wenn Sie, dass feinkörnige bekommen wollen ... Ich glaube, IMDB, dass der Fall ist.

Hoffentlich wird die Namen der oben genannten Bereiche sollten auf dem Fremdschlüssel andeuten, und ich habe den Primärschlüssel setzt _underscores_ um ich verwenden würde.

Ihre Filme Tabelle muss auch Links zum Genre, Regisseur und Schauspieler Tabellen. Da die Akteure zumindest viele, viele zu (ein Film wird mehr als ein Schauspieler Liste, ein Schauspieler in mehr als ein Film sein wird), müssen Sie einen Tisch, sie zu verbinden.

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)

Jede Tabelle, die viele viele sein könnte braucht eine Verknüpfungstabelle.

  

Ich habe eine eindeutige ID für die Filme der Tabelle mit einem Primärschlüssel erstellt, die automatisch erhöht, muß ich eine eindeutige ID für jede Tabelle erstellen?

Ja, jede Tabelle muss hat eine eindeutige ID. Aber das ist nicht unbedingt das primäre Auto Erhöhen Schlüssel - es ist, was macht diese bestimmte Instanz eindeutig. Zum Beispiel für Filme, ich denke, es ist üblich, Titel + Jahr der Veröffentlichung zu sein - auch wenn Sie mit einem Filmfan (ein Domain-Experten) um sicher zu sein, dass überprüfen wollen würden. Das Auto-Inkrement ist ein Rückfall -. Im Grunde, wenn Sie wirklich haben nichts anderes uniqueify auf

Sie können ein Auto-increment Schlüssel für Benutzerfreundlichkeit verwenden in beitritt und so, aber man sollte auf jeden Fall eine eindeutige Einschränkung auf die Einzigartigkeit Felder haben.

Wie für die tatsächliche Gestaltung, würde ich vorschlagen, so etwas wie:

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))

Für den Einsatz, gut - ehrlich gesagt, ist es ein PITA. Sie müssen in umgekehrter Reihenfolge eingefügt werden soll (und das ist, wo Autoinkrement Tasten kann eine noch größere PITA - wenn Sie das Geburtsdatum oder etwas in die Schauspieler und Regisseure Tabelle aufgenommen werden können, dann eine eindeutige Einschränkung kann es leichter machen).

Also, Sie würden einfügen Darsteller (n), Regisseur, Film, und dann Films_Actors. Im Idealfall alle in einer einzelnen Transaktion. Außerdem gehe ich davon aus Genre ist bereits ausgefüllt, und eine Auswahlliste - so es muss nicht eingefügt werden

.

Sie können herunterladen Imdb Schema hier .

Ich weiß, Ihre Frage bereits beantwortet wurde, aber ich Sie darauf hinweisen wollte:
  http://www.imdb.com/interfaces

IMDB liefert Flachtextdateien ihrer Datenbank (minus Primärschlüssel). Man könnte dies nützlich finden Sie Ihre Datenbank zu füllen, wenn Sie gehen, oder Sie es in Ihrem Programm / Webseite nutzen könnten, um Sie einfach einen Film Titel zu erlauben zu suchen, um Ihre „DVD Collection“ und hat den Rest der Informationen hinzufügen zog aus diesen.

Manchmal Akteure sind Direktoren und vice versa, vielleicht möchten Sie ein „Volk“ Tabelle?

Sie brauchen nicht wirklich eine YearTable, und alles, was Sie brauchen, ist ein genre_id, director_id und actor_id Spalten in Ihren Filmen Tabelle.

Auch Ihre Genre, Regisseur und Schauspieler Tabellen benötigen, um ihre eigene eindeutige IDs.

Edit: Dies ist natürlich unter der Annahme, dass Sie nur 1 Genre haben gehen, Regisseur, und Schauspieler für jeden Film. Welche wahrscheinlich nicht der Fall ist.

Um die zu vielen Filmen viele Schauspieler haben, müssen Sie eine separate Beziehungen Tabelle. Man könnte es "moviesActors" (oder actorsMovies) nennt, und jede Zeile wird ein actor_id und eine movie_id zu sagen Diese Darsteller wurde in Film .

Jede Tabelle sollte einen Primärschlüssel haben, die einzigartig ist.

Sie sollten nachlesen auf Datenbank Normalisierung .

Ein Jahr Tabelle ist wahrscheinlich nicht erforderlich.

Wenn es Jahr der Veröffentlichung ist, sagt sie, dann kann das Jahr in dem Film gespeichert werden.

Wenn es mehrere Direktoren auf einem Film sind, dann würden Sie eine separate Tabelle haben, die den Primärschlüssel des Films Tabelle und der Direktor Tisch halten würde. In ähnlicher Weise für jede der Fremdschlüssel-Constraints, die viele-zu-eins oder many-to-many sind. Insbesondere glaube ich, dies den Schauspieler gelten würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top