2012-06-24 1 views
7

Ich versuche eine Feuerwaffen-Website zu erstellen, die etwa 1000 Waffen aufnehmen wird. Dies sind nicht viele Datenbankeinträge, aber ich versuche die Datenbank so hell wie möglich zu halten. Ich habe fünf Tabellen erstellt, die Normalisierung im Auge behalten, und ich habe Probleme, Daten in alle fünf Tabellen in einer Abfrage zu setzen. Meine Datenbank ist wie so strukturiert:Wie mit mehreren Tabellen arbeiten und keine doppelten Daten erhalten? (MySQL/PDO)

+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
|  make  + |  model  | |  image  | |  type  | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
| PK | make_id | | PK | model_id | | PK | model_id | | PK | type_id | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
| | make_name | | | make_id | | | image_path | | | type_name | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
        | | type_id | 
        +-----------------+   +------------------+ 
        | | caliber_id |   |  caliber  | 
        +-----------------+   +------------------+ 
        | | model_name |   | PK | caliber_id | 
        +-----------------+   +------------------+ 
        | | cost  |   | | caliber_name| 
        +-----------------+   +------------------+ 
        | | description| 
        +-----------------+ 

Dies könnte zu normalisiert werden, aber das ist, was ich arbeite mit;)

mir den Code Lassen Sie zeigen:

Form

<form action="post" method="addProduct.php" enctype="multipart/form-data"> 
    make: <input type="text" name="make" /> 
    model: <input type="text" name="model" /> 
    type: <input type="text" name="type" /> 
    caliber: <input type="text" name="caliber" /> 
    cost: <input type="text" name="cost" /> 
    desc.: <input type="text" name="description" /> 
    Image: <input type="file" name="image" id="image" /> 
      <input type="submit" name="submit" value="Add Item" /> 
</form> 

addProduct.php

Also wenn ich ein Element mit dem obigen Code hinzufügen, funktioniert alles gut, aber wenn ich ein anderes Element mit dem gleichen Herstellernamen hinzufügen, wird es duplizieren. Ich will nur, dass es erkennt, dass es bereits existiert und nicht dupliziert.

Ich habe überlegt, irgendeine Art von Prüfung zu stellen, um zu sehen, ob diese Daten bereits existieren, und wenn es das tut, dann gebe die Daten nicht ein, sondern hole die ID und gebe sie in die anderen Tabellen ein.

Eine andere Sache, die ich dachte, war, ein Dropdown für die Daten zu erstellen, die wahrscheinlich dupliziert werden und den Wert als die ID zuweisen. Aber, mein einfacher Verstand kann nicht den besten Weg herausfinden, es zu tun :(Hoffentlich macht das alles Sinn, wenn nicht, werde ich versuchen, zu erarbeiten.

Antwort

1

Wenn Sie Felder haben, in denen es immer nur eine begrenzte Menge von Daten geben wird (Kaliber ist definitiv eins, und ich vermute, dass Hersteller auch funktionieren), können Sie die Tabellen in der Datenbank vorbelegen und in diese umwandeln ein Nachschlagefeld

Auf Ihrem HTML-Formular können Sie anstelle eines Texteingabefeldes stattdessen eine Auswahlbox ausdrucken. Der Wert der Auswahl ist die ID im Nachschlagefeld - Sie müssen sich keine Gedanken darüber machen, ob Sie den Nachschlagefeldern in der Datenbank etwas hinzufügen können.

Wenn ich das in der Vergangenheit tun musste, habe ich eine Funktion geschrieben, um die Daten einzufügen; Es prüft, ob der Wert in der Tabelle ist. Ist dies der Fall, wird der Index des Feldes zurückgegeben. Andernfalls wird sie als neuer Eintrag hinzugefügt und die ID für den neuen Eintrag zurückgegeben. Es ist nicht die eleganteste Lösung, aber es funktioniert gut.

+0

Dank andrevisi, ging ich mit Ihrem Vorschlag. Ich fülle nur ausgewählte Felder für die eindeutigen Daten aus. Eine andere Sache, die ich fand, war, dass PDO Funktionalität eingebaut hat, wie Ollie für MySQL erwähnt, dass es beim Einführen von Daten doppelte Einträge bemerkt und die Einfügung nicht vervollständigt wird, während ein benutzerdefinierter Fehler geworfen wird. Vielen Dank! – Mike

2

Sie müssen herausfinden, was eine einzigartige (unduplicated) bildet, Modell, Typ und Kaliber.

Dann müssen Sie eindeutige Indizes für diese Tabellen erstellen, die die Einzigartigkeit erzwingen. Siehe http://dev.mysql.com/doc/refman/5.0/en/create-index.html

zum Beispiel Sie make_id verwenden könnten, model_name und caliber_id eindeutig ein Modell zu identifizieren. Sie benötigen

CREATE UNIQUE INDEX UNIQUEMODEL ON MODEL(make_id, caliber_id, model_name) 

, um Ihren eindeutigen Index einzurichten. Beachten Sie, dass ein Primärschlüssel-Index ein eindeutiger Index sein kann, Sie aber auch andere eindeutige Indizes haben können.

Sie können dann INSERT ON DUPLICATE KEY UPDATE verwenden, um Ihre Tabellen zu füllen. Siehe hier: http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

Für all dies korrekt arbeiten, werden Sie sicher, dass geeignete type, caliber machen müssen, und make Reihen vorhanden sein, bevor Sie versuchen, jede model Zeile zu füllen: Sie können die IDs von den ersten drei Tabellen müssen bevölkern die vierte.

Verwandte Themen