Foreign key mit mehreren Spalten aus verschiedenen Tabellen

Nehmen wir ein blödes Beispiel : ich habe viele Tiere, ein jedes mit einem NAMEN wie eine id und einen Typ (als KATZE oder HUND), schreiben wir es auf diese Weise (pseudo-code) :

TABLE ANIMALS (
  NAME char,
  ANIMAL_TYPE char {'DOG', 'CAT'}
  PRIMARY KEY(NAME)
)

(zum Beispiel, ich habe eine KATZE namens Felix und einen Hund namens Pluto)

In einer anderen Tabelle möchte ich store die bevorzugte Nahrung für alle meine Tiere :

TABLE PREFERED_FOOD (
  ANIMAL_NAME char,
  PREF_FOOD char
  FOREIGN KEY (ANIMAL_NAME) REFERENCES ANIMALS(NAME)
)

(zum Beispiel Felix liebt Milch, und Pluto mag Knochen)

Als ich mag würde, um zu definieren, eine Reihe von möglichen bevorzugte Lebensmittel Lagere ich in einer Dritten Tabelle der Lebensmittel-Typen, die für jede Art von Tier :

TABLE FOOD (
  ANIMAL_TYPE char {'DOG', 'CAT'},
  FOOD_TYPE char
)

(zum Beispiel, Hunde fressen Knochen und Fleisch, Katzen Essen Fisch und Milch)

Hier kommt meine Frage : ich möchte noch hinzufügen, dass eine ausländische Einschränkung in PREFERED_FOOD, so wie die PREF_FOOD ist ein FOOD_TYPE von SPEISEN mit LEBENSMITTELN.ANIMAL_TYPE=TIERE.TYP. Wie kann ich definieren, diese Fremdschlüssel, ohne duplizieren der ANIMAL_TYPE auf PREFERED_FOOD ?

Ich bin kein Experte mit SQL, so können Sie rufen Sie mich dumm, wenn ist es wirklich einfach 😉

  • Das erste, was ich tun würde, ist mit den numerischen Tasten statt char keys
  • Ich bin damit einverstanden, numerische Tasten sind wirklich besser, diese Dinge zu vereinfachen, wenn viele Anfänger denken, Sie sind wirklich unnötig.
  • Können Sie haben einen Hund namens Felix so gut wie eine Katze namens Felix? Können Sie eine Katze namens Pluto, sowie einen Hund namens Pluto? Dies treibt an ', Was ist der Primärschlüssel der Tiere, Tisch?' — es ist immer hilfreich, explizit genannt werden, weil (wie Sie sagen können, aus meine Frage), was Sie offensichtlich können nicht offensichtlich sein, zu anderen Menschen. Die FK in der Bevorzugten Lebensmittel-Tabelle legt nahe, dass Sie können nicht zwei verschiedene Tiere mit dem gleichen Namen zur gleichen Zeit, aber das ist eine indirekte, aber vermutlich zuverlässig — Inferenz.
  • Sie können auch einen db trigger zum erzwingen der Datenintegrität constraints. Auch Graben die char foreign keys, nur einen tag erstellen Tabelle zum speichern der Beschreibungen und verwenden Sie ids, um Aussehen em up
  • Yeap, sicher, die pet name als primary key ist nicht gut. Ich schrieb es auf diese Weise zu veranschaulichen, die Frage. Die Frage war nur auf den letzten Punkt, und diese Tabellen sind nur ein blödes Beispiel ;-).
  • (und ich halte die trigger-Vorschlag im Hinterkopf, du hast Recht, ich wollte nur zu halten auf foreign keys, aber wenn ich nicht Triggern könnte fast den job machen)

InformationsquelleAutor user1695584 | 2012-09-24
Schreibe einen Kommentar