2017-11-07 28 views
0

Ich bin neu in SQL und das ist meine erste Post hier. Ich habe mir viele sehr ähnliche Antworten angeschaut, konnte aber meine Frage nicht ganz zu Ende bringen. Hier ist ein Beispiel für das, was ich für eine Spieldatenbank versuche.Viele bis viele relationale Datenbank

Ich habe eine Tabelle, in der Spielercharakterinformation gehalten wird. Ich habe eine weitere Tabelle, in der alle möglichen Statusauswirkungen gespeichert sind. Ich versuche herauszufinden, wie man eine Beziehung erstellt, in der alle/alle/keine der Zeicheneinträge in der ersten Tabelle mit irgendwelchen/allen/keinem der Statuseinträge in der zweiten Tabelle verknüpft werden können. Meine Nachforschungen haben ergeben, dass ich wahrscheinlich eine dritte Tabelle benötige und eventuell zusammengesetzte Primärschlüssel und/oder Ersatzschlüssel verwenden muss?

Nochmals, erstes Mal, so leid tut mir leid, wenn ich das nicht richtig mache. Könnte mir jemand einen Hinweis geben, wie ich dieses Thema durchdenken soll? Vielen Dank.


Also hier ist ein Update basierend auf Antworten. Ich habe anscheinend gearbeitet, was ich zu erreichen hoffte. Hier ist der Code:

create table characters (
    char_id int primary key auto_increment, 
    name varchar(25) 
    ); 

    create table health_status (
    status_id int primary key auto_increment, 
    stat_name varchar(15) 
    ); 

    create table char_status (
    char_id int, 
    status_id int, 
    primary key (char_id, status_id) 
    ); 

    insert into characters (name) values ('Godzilla'); 
    insert into characters (name) values ('King Kong'); 
    insert into characters (name) values ('Mecha-Dragon'); 
    insert into characters (name) values ('Chris Hanson'); 
    insert into characters (name) values ('Journey'); 
    insert into characters (name) values ('Lou Diamond Phillips'); 
    insert into characters (name) values ('RedHot'); 

    insert into health_status (stat_name) values ('Bleeding'); 
    insert into health_status (stat_name) values ('Shaken'); 
    insert into health_status (stat_name) values ('Frightened'); 
    insert into health_status (stat_name) values ('Petrified'); 
    insert into health_status (stat_name) values ('Poisoned'); 
    insert into health_status (stat_name) values ('Slowed'); 
    insert into health_status (stat_name) values ('Rushed'); 
    insert into health_status (stat_name) values ('Endowed'); 

    insert into char_status (char_id, status_id) values (1, 1); 
    insert into char_status (char_id, status_id) values (1, 3); 
    insert into char_status (char_id, status_id) values (1, 6); 
    insert into char_status (char_id, status_id) values (2, 2); 
    insert into char_status (char_id, status_id) values (2, 4); 
    insert into char_status (char_id, status_id) values (3, 7); 
    insert into char_status (char_id, status_id) values (6, 8); 
    insert into char_status (char_id, status_id) values (7, 2); 
    insert into char_status (char_id, status_id) values (7, 7); 

    select characters.name, health_status.stat_name 
    from characters 
    left join char_status on characters.char_id = char_status.char_id 
    left join health_status ON health_status.status_id = 
    char_status.status_id; 

Ich habe drei Fragen. Sieht irgendjemand irgendeinen Weg, dies zu bereinigen, oder einen besseren Weg, um mein Ziel zu erreichen? Ist die Verbindung PK in der Tabelle char_status wirklich nützlich? Und schließlich: Gibt es eine Möglichkeit, die Ausgabe mit einer Abfrage so zu organisieren, dass der Charaktername nur einmal aufgeführt wird, gefolgt von dem zugehörigen Status - oder ist dies etwas für eine andere Sprache? Danke für die Hilfe von allen!

+0

Wie Sie MySQL verwenden, empfehle ich Ihnen so etwas wie MySQL Workbench versuchen.Damit können Sie solche Beziehungen per Drag and Drop erstellen und Sie können sich mit solchen relationalen Modellen vertraut machen. – harandk

+0

Hallo. Sie müssen ein einführendes Lehrbuch zur Informationsmodellierung und zum Design relationaler Datenbanken lesen. Das ist es, was Ihre Frage verlangt, wenn auch mit einem maßgeschneiderten Tutorial-Beispiel. Wie könnte eine Antwort gerechtfertigt sein - wenn Sie nichts wissen, muss es von Grund auf neu erklärt werden. Wenn Sie eine bestimmte Frage zu einem bestimmten Code oder Design für eine bestimmte Spezifikation haben, stellen Sie eine Frage. – philipxy

Antwort

1

Basierend auf Ihrer Struktur Sie sagen, Sie brauchen, um weitere neue Tabelle erstellen und Daten in sie setzen. **

Damit Sie zwischen tableA und TableB Sie ein Primärschlüssel haben müssen, um eine Verbindung in eine und auch seine Referenz in anderen

**. Viele zu viele Beziehungen sind so etwas wie eine gegenseitige Beziehung, wobei TabelleA von vielen Elementen von Tabelle B und umgekehrt abhängt.

Möglicherweise müssen Sie Ihre Tabellen basierend auf Ihrer Situation zunächst normalisieren.

Werfen Sie einen Blick auf Normalization_tuorial Als nächstes hat auch einen Blick auf one-many and many-many etc..

1

Wie Sie bei Ihrem Recherche

gefunden

eine dritte Tabelle mit zwei Feldern erstellen, die die „id“ (Hauptfeld) aus halten werden diese zwei Tabellen, die Sie Beziehung viele zu viele machen wollen ...

CREATE TABLE `many_to_many` (`information_id` INT(11) NOT NULL , `status_id` INT(11) NOT NULL , PRIMARY KEY (`information_id`, `status_id`)) ENGINE = MyISAM; 

Pay attension auf den Primärschlüssel, die zwei Felder auf thos abhängen.

Jetzt können Sie hinzufügen, für jeden viele status_id Beziehungen information_id,

und für status_id viele information_id Beziehungen.

Für ersten Versuch, diese Abfrage ausführen Werte hinzufügen, um es zu sehen

INSERT INTO `many_to_many` (`information_id`, `status_id`) VALUES (1, 1), (1, 2), (2, 1), (2, 2); 
Verwandte Themen