Ich habe zwei Tabellen in MySQL. Tabelle Person hat die folgenden Spalten:
id | name | fruits
Die fruits
Spalte kann null oder eine Reihe von Zeichenfolgen wie ('Apfel', 'Orange', 'Banane') oder ('Erdbeere') usw. enthalten. Die zweite Tabelle ist Table Fruit und enthält die folgenden drei Spalten:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Wie soll ich die fruits
Spalte in der ersten Tabelle so gestalten, dass sie ein Array von Zeichenfolgen enthalten kann, die Werte aus der fruit_name
Spalte in der zweiten Tabelle übernehmen? Wie soll ich vorgehen, da es in MySQL keinen Array-Datentyp gibt?
mysql
database-schema
Tonga
quelle
quelle
Antworten:
Der richtige Weg, dies zu tun, besteht darin, mehrere Tabellen und
JOIN
diese in Ihren Abfragen zu verwenden.Beispielsweise:
Die
person_fruit
Tabelle enthält eine Zeile für jede Frucht einer Person zugeordnet ist und verbindet effektiv dasperson
undfruits
Tabellen zusammen, IEWenn Sie eine Person und all ihre Früchte abrufen möchten, können Sie Folgendes tun:
quelle
person_id
aber ein anderesfruit_name
. Dies ist effektiv eine Implementierung der Theorie aus Janus 'Antwort.person
Tabelle enthalten sein, alle Informationen über die Früchte in derfruits
Tabelle und alle Informationen speziell über die Beziehung zwischen einer bestimmten Person und einer bestimmten Frucht in derperson_fruit
Tabelle. Da in diesem Beispiel keine zusätzlichen Informationen vorhanden sind, besteht dieperson_fruit
Tabelle nur aus zwei Spalten, den Primärschlüsseln der Tabellenperson
undfruits
. Die Menge einer bestimmten Frucht ist ein Beispiel für etwas anderes, das jedoch in dieperson_fruit
Tabelle aufgenommen werden könnte.INT
für einen Schlüssel zu verwendenfruits
und nur diesenINT
zu habenperson_fruit
? Der Name kann also später geändert werden und würde auch weniger Platz benötigen, wenn Sie nicht viel mehr Zeilenfruits
als in habenperson_fruit
.Der Grund dafür, dass es in SQL keine Arrays gibt, ist, dass die meisten Leute es nicht wirklich brauchen. Relationale Datenbanken (SQL ist genau das) arbeiten mit Relationen. In den meisten Fällen ist es am besten, wenn Sie jedem "Informationsbit" eine Zeile einer Tabelle zuweisen. Wenn du zum Beispiel denkst "Ich möchte hier eine Liste mit Dingen", erstelle stattdessen eine neue Tabelle und verknüpfe die Zeile in einer Tabelle mit der Zeile in einer anderen Tabelle. [1] Auf diese Weise können Sie M: N-Beziehungen darstellen. Ein weiterer Vorteil ist, dass diese Links die Zeile mit dem verknüpften Element nicht überladen. Und die Datenbank kann diese Zeilen indizieren. Arrays sind normalerweise nicht indiziert.
Wenn Sie keine relationalen Datenbanken benötigen, können Sie z. B. einen Schlüsselwertspeicher verwenden.
Lesen Sie bitte mehr über die Datenbanknormalisierung . Die goldene Regel lautet: "[Jeder] Nichtschlüssel [Attribut] muss eine Tatsache über den Schlüssel, den gesamten Schlüssel und nichts als den Schlüssel enthalten." Ein Array macht zu viel. Es hat mehrere Fakten und speichert die Reihenfolge (die nicht mit der Beziehung selbst zusammenhängt). Und die Leistung ist schlecht (siehe oben).
Stellen Sie sich vor, Sie haben einen Personentisch und einen Tisch mit Telefonanrufen von Personen. Jetzt können Sie jeder Personenzeile eine Liste ihrer Telefonanrufe geben. Aber jeder Mensch hat viele andere Beziehungen zu vielen anderen Dingen. Bedeutet das, dass meine Personentabelle ein Array für jede einzelne Sache enthalten sollte, mit der er verbunden ist? Nein, das ist kein Attribut der Person selbst.
[1]: Es ist in Ordnung, wenn die Verknüpfungstabelle nur zwei Spalten enthält (die Primärschlüssel aus jeder Tabelle)! Wenn die Beziehung selbst zusätzliche Attribute hat, sollten sie in dieser Tabelle als Spalten dargestellt werden.
quelle
MySQL 5.7 bietet jetzt einen JSON-Datentyp . Dieser neue Datentyp bietet eine bequeme neue Möglichkeit zum Speichern komplexer Daten: Listen, Wörterbücher usw.
Allerdings ordnen Rrays Datenbanken nicht gut zu, weshalb objektrelationale Karten sehr komplex sein können. In der Vergangenheit haben Benutzer Listen / Arrays in MySQL gespeichert, indem sie eine Tabelle erstellt haben, die sie beschreibt, und jeden Wert als eigenen Datensatz hinzugefügt haben. Die Tabelle enthält möglicherweise nur 2 oder 3 Spalten oder viele weitere. Wie Sie diese Art von Daten speichern, hängt wirklich von den Eigenschaften der Daten ab.
Enthält die Liste beispielsweise eine statische oder dynamische Anzahl von Einträgen? Wird die Liste klein bleiben oder wird sie voraussichtlich auf Millionen von Datensätzen anwachsen? Wird es viele Lesungen auf dieser Tabelle geben? Viele schreibt? Viele Updates? Dies sind alles Faktoren, die bei der Entscheidung über die Speicherung von Datensammlungen berücksichtigt werden müssen.
Auch Key: Value-Datenspeicher / Dokumentenspeicher wie Cassandra, MongoDB, Redis usw. bieten eine gute Lösung. Beachten Sie nur, wo die Daten tatsächlich gespeichert werden (wenn sie auf der Festplatte oder im Speicher gespeichert sind). Nicht alle Ihre Daten müssen sich in derselben Datenbank befinden. Einige Daten lassen sich nicht gut auf eine relationale Datenbank abbilden, und Sie haben möglicherweise Gründe, sie an anderer Stelle zu speichern, oder Sie möchten eine speicherinterne Schlüssel-Wert-Datenbank als Hot-Cache für Daten verwenden, die irgendwo auf der Festplatte gespeichert sind, oder als kurzlebiger Speicher für Dinge wie Sitzungen.
quelle
Als Randnotiz sollten Sie Arrays in Postgres speichern.
quelle
Verwenden Sie in MySQL den JSON-Typ.
Entgegen den obigen Antworten enthält der SQL-Standard seit fast zwanzig Jahren Array-Typen. Sie sind nützlich, auch wenn MySQL sie nicht implementiert hat.
In Ihrem Beispiel möchten Sie jedoch wahrscheinlich drei Tabellen erstellen: Person und Obst, dann person_fruit, um sie zu verbinden.
Wenn Sie die Person mit einer Reihe von Früchten verknüpfen möchten, können Sie dies mit einer Ansicht tun:
Die Ansicht zeigt folgende Daten:
In 5.7.22 möchten Sie JSON_ARRAYAGG verwenden , anstatt das Array zusammen aus einer Zeichenfolge zu hacken.
quelle
Verwenden Sie den Datenbankfeldtyp BLOB, um Arrays zu speichern.
Ref: http://us.php.net/manual/en/function.serialize.php
quelle
Sie können Ihr Array mit group_Concat so speichern
HIER ein Beispiel in Geige
quelle