Frage

Ich versuche, Fremdschlüssel verwenden ordnungsgemäß Datenintegrität zu gewährleisten. Ich bin nicht wirklich eine Datenbank Kerl so dass ich frage mich, ob es eine allgemeine Konstruktionsprinzip ist, ich weiß über nicht. Hier ist ein Beispiel dafür, was ich versuche zu tun:

Angenommen, Sie möchten eine Datenbank von Fahrzeugen mit Typ (PKW, LKW, etc.) bauen, Fabrikat und Modell. Ein Benutzer muss Eingang mindestens den Typen, aber das Fabrikat und Modell ist optional (wenn Modell gegeben ist, dann ist Make erforderlich). Meine erste Idee ist es, die Datenbank als solche einzurichten:

Type:
-id (PK)
-description

Make:
-id (PK)
-type_id (FK references Type:id)
-description

Model:
-id (PK)
-make_id (FK references Make:id)
-description

Vechicle:
-id (PK)
-type_id (FK references Type:id)
-make_id (FK references Make:id)
-model_id (FK references Model:id)

Wie würden Sie Setup die FKs für Fahrzeug, um sicherzustellen, dass der Typ, Marke, Modell und alle zusammenpassen? Zum Beispiel, wie würden verhindern, dass Sie ein Fahrzeug mit (Typ: Motorcyle, Marke: Ford, Modell: Civic)? Jede dieser würde gültig FKs sein, aber sie halten nicht die Beziehungen dargestellt durch die anderen Tabellen FKs.

Auch, weil Modell nicht erforderlich ist, kann ich nicht nur speichern die MODEL_ID FK und Arbeit rückwärts von ihm.

Ich bin nicht in der Datenbank-Design überhaupt gebunden, so dass ich die Möglichkeit offen bin von der Art, wie die Tabellen ändern zu müssen eingerichtet werden. Irgendwelche Ideen?

P. S. -. Ich bin mysql, wenn jemand interessiert verwenden, aber das ist eher eine allgemeine Frage zu Datenbanken

Edit (Klärungen):

-type_id und make_id ist in der Fahrzeugtabelle benötigt, es sei denn, dass eine Weise, die in dem Fall um herauszufinden, dass MODEL_ID null ist;

-die Beziehungen zwischen type_id, make_id und MODEL_ID Notwendigkeit, aufrecht erhalten werden.

War es hilfreich?

Lösung

Was Sie suchen ist eine CHECK-Einschränkung. Leider ist MySQL derzeit nicht unterstützt dies. Sie könnten eine solche Funktionalität mit Trigger emulieren, aber Sie würden sowohl eine INSERT und einen UPDATE-Trigger für sie zu arbeiten erstellen müssen.

Wie jedoch andere Antworten angegeben haben, alle sollten Sie wirklich Modell ist das Fahrzeug werden zu speichern. In Ihrem Antrag sollten Sie auf die Art bohren nach unten, wenn es verfügbar ist.

Andere Tipps

Wie folgt aus:

Typ:

  • id (PK)
  • Beschreibung

Fabrikat:

  • id (PK)
  • type_id (FK Referenzen Typ: id, nicht null)
  • Beschreibung

Modell:

  • id (PK)
  • make_id (FK Referenzen Marke: id, nicht null)
  • Beschreibung

Vechicle:

  • id (PK)
  • MODEL_ID (FK verweist Modell: id)

Im Grunde nicht doppelt Referenzmarken und Typ von Fahrzeug als auch. Sie werden auf Probleme stoßen, wenn Sie das tun. Sie können das Make bekommen und aus dem Modell des Fahrzeugtyps (falls definiert). Modell muss machen. Jetzt muss Typen haben.

Denken Sie, dass für eine zweite: wenn das Fahrzeug ein bestimmtes Modell aber Fahrzeug hat und beide modellieren eine Marke haben, können diese Werte unterschiedlich sein. Diese Art von Inkonsistenz kann wegen Informationsredundanz entwickeln. Sie möchten, dass generell vermeiden.

Wenn Sie die SQL beginnt die Marke und Typ eines Fahrzeugs Figur müssen wie folgt aussehen:

SELECT v.id, v.model_id, m.make_id, k.type_id
FROM vehicle v
LEFT JOIN model m ON v.model_id = m.id
JOIN make k ON m.make_id = k.id
JOIN type t ON k.type_id = t.id

Und so weiter.

Hier ist ein Ansatz:

- Ein (Ford, GM, Honda) viele Modelle haben , ein Modell gehört nur eine Marke zu.
- Modell ist von einem bestimmten Typ (Auto, LKW Fahrrad).
- Fahrzeug ist von einem bestimmten Modell . Ein Fahrzeug kann sein, nur ein Modell ; es können viele Fahrzeuge eines Modells sein.

Modell Tabelle enthält Spalten, die für alle Modelle; während Auto, LKW, Motorrad und zu jeder Spalt spezifisches haben.

Wenn Sie eine DB Modellierung, sollten Daten, Entitäten und Beziehungen; nicht von der UI starten - gibt es eine Business-Schicht dazwischen Art Dinge. Es ist OK, MySQL zu verwenden, können Sie Prüfung und Fremdschlüssel-Constraints auf Anwendungsebene durchzusetzen.
vehicle_model_01

Ihr Design ist in Ordnung für die Datenintegrität, wird es die Aufgabe der Anwendung zu warten, dass ein Fahrzeug von Makes von einem bestimmten Typ und Modellen eines bestimmten Make nachgeholt werden muss.

Wenn Sie Fahrzeugtyp / Marke / Modell Integrität in der Datenbank beibehalten möchten können Sie eine Check-Bedingung zu Ihrem Fahrzeug Tabelle hinzufügen, die sicher, dass die Art id Make Vehicle machen gleich den Typ-ID zur Verfügung gestellt. Und wenn die Modell-ID nicht null ist, stellen Sie sicher, dass es Make-ID das gleiche wie der Make-ID ist vorgesehen.

Ich sehe bereits Sie eine Antwort akzeptiert, aber ein alternativer Ansatz, dass Griffe Ihre ist strukturelles Problem und nicht Auslöser verwenden oder Zwänge überprüfen wäre Dummy-Einträge in die Marke und Modell zum Erstellen von Tabellen mit eine Beschreibung von „n / a“ oder so, eine für jeden Eintrag in Typ und Marke ist und dann die redundanten Spalten in Fahrzeug loszuwerden.

So, wenn alles, was Sie wissen, die Art eines Fahrzeugs ist, dann würden Sie den Dummy-Eintrag in Make finden, dass Verweisen der entsprechende Typ, dann den Dummy-Eintrag in Modell findet, dass Verweise, dass zu machen, dann Verweis, dass Modell aus dem neue Zeile in Fahrzeug.

Die wichtigsten Nachteile wäre natürlich zusätzliche Housekeeping sein, um die Dummy-Reihen zu erstellen, entweder vor der Zeit, wenn ein Typ oder Fabrikat Hinzufügen oder bei Bedarf, wenn ein Fahrzeug mit fehlenden Daten hinzugefügt wird.

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