Frage von BGSBNNY, 42

MySQL - mehrere Werte in einer Zeile einbinden wie stell ich dies am besten an?

Also ich habe eine Pokemon Datenbank. Ich habe 2 Tabelle, jeweils "Pokemon" und "Trainer". Nun möchte ich es schaffen, dass ein Trainer mehrere Pokemon besitzen kann. ich habe mir überlegt den Trainer einen Primary Key zu geben und so diese zu verbinden. Gibt es vielleicht andere Vorgehensweisen? Ich möchte nämlich es schaffen das ein Trainer NUR max. 6 Pokemon besitzen darf und dies würde ich mit dem Primary Key nicht hinbekommen, oder?

Antwort
von Suboptimierer, 16

Über die Anzahl an Zeilen kannst du das nicht steuern, da es in jeder Tabelle beliebig viele Zeilen geben kann.

Du kannst aber, wenn es dir nichts aus macht, auf Designrichtlinien zu pfeifen, in der Tabelle Trainer einfach 6 Spalten für die Pokemon, die er trainiert, anlegen.

Der Primary Key identifiziert lediglich eindeutig einen Datensatz in einer Tabelle und ist indiziert.

Antwort
von Tschoo, 23

Hallo!

Mit dem Key liegst du richtig -- aber die max(6) entweder in das Umgebende Programm oder einen "Trigger" in die Pokemontabelle, z.B. einen Zähler für jeden Key in die Pokemon-Tabelle, der zählt, wievielmal der Key vergeben ist und dann nicht mehr als 6 zulassen -- ist aber sehr umständlich. Würde das ausserhalb der DB machen.

Andere Idee, eine dritte Tabelle "Key-Verwaltung" -- hier für jeden Key noch eine Spalte mit  "x-mal vergeben", und immer bevor der Key vergeben wird, dort nachschauen, ob es noch geht (eigentlich wieder nur mit einem Trigger realisierbar)

Gruß

Antwort
von wotan38, 9

Ich würde eine Hilfstabelle einrichten, die nur eine Spalte mit den Zahlen 1 bis 6 als Primärschlüssel hat und diese Tabelle mit den 6 möglichen Sätzen füllen. In der Pokemontabelle würde ich einen Zähler als Fremdschlüssel vorsehen und einen unique Index in Verbindung mit der Trainer-Id drauflegen.

Jetzt muss jeder Pokemonsatz, der geschrieben wird, im Zähler eine Zahl zwischen 1 und 6 haben (wegen Fremdschlüssel) und keine Zahl kann innerhalb einer Trainer-Id mehrfach vorkommen (wegen eindeutigem Index). So gibt es keine Möglichkeit für einen Trainer, mehr als 6 Sätze anzulegen. Jeder Versuch, einen 7. Satz anzulegen würde gegen die Regelung verstoßen und von der Datenbank abgewiesen werden.

Vor dem Schreiben eines Satzes müsste immer erst eine freie Nummer ermittelt werden. Nachfolgende Abfrage würde die erste freie Nr. des Trainers mit der Id 12345 bringen:

  
SELECT MIN(zaehler) FROM hilfstabelle
WHERE zaehler NOT IN
(SELECT zaehler FROM pokemontabelle
WHERE trainer-id = 12345)

Die Anzahl der erlaubten Sätze wäre dann frei wählbar, je nach der Anzahl der Sätze in der Hilfstabelle. Zu dieser dürfte natürlich nur der Administrator Zugriff haben.

Antwort
von EightSix, 20

Das ist auch Teil der Geschäftslogik und hat im Datenbankdesign nix zu suchen.

Kommentar von BGSBNNY ,

könntest du das näher erläutern?

Kommentar von EightSix ,

Dass das im Programmcode überprüft werden muss und nicht in der Datenbank. Ich beziehe mich auf die Anzahl.

Kommentar von wotan38 ,

Warum sollte man eine Geschäftslogik nicht in der Datenbank realisieren?

Keine passende Antwort gefunden?

Fragen Sie die Community