8 Stimmen

Einfügen eines Arrays in die Datenbank in einer einzigen Zeile

Ich frage mich, ob das machbar wäre? Um ein Array in ein Feld in der Datenbank einzufügen.

Wenn ich zum Beispiel einen Titel habe, möchte ich, dass dieser Titel nur eine ID hat, aber er wird auf der Website zweisprachig verwendet werden.

Es erscheint mir etwas unnötig, eine weitere Tabelle mit den globalen IDs zu erstellen und dann eine weitere Tabelle mit den tatsächlichen Titeln, die mit der Tabelle mit der globalen ID verknüpft sind.

Ich möchte nur etwas wie das hier haben

ID      TITLE
1       Array("english title", "nederlandse titel");

Ich benutze PHP/MSYQL, also wenn es machbar wäre, könnten Sie bitte in diesen Sprachen erklären.

Oh ja, ich dachte, ich könnte es funky formatieren und die Split-Funktion verwenden, um es wieder in ein Array zu verwandeln. Aber ich frage mich, ob ich es einfach als Array sofort speichern könnte, falls der Benutzer etwas mit der gleichen Formatierung eingeben könnte (eine von einer Million)

15voto

Owen Punkte 79611

Es ist machbar:

$title = serialize($array);

und dann zu entschlüsseln:

$title = unserialize($mysql_data);

aber wie bereits erwähnt, schmälert es die Vorteile einer Datenbank in erster Linie. Ich würde auf jeden Fall vorschlagen, stattdessen eine Option mit mehreren Tabellen oder Spalten in Betracht zu ziehen, je nachdem, wie viele Sprachen Sie unterstützen möchten und ob sich diese Anzahl in Zukunft ändern wird.

bearbeiten: ein guter Punkt, der von dcousineau (siehe Kommentare)

Manchmal wirft die serialisierte Ausgabe, selbst nach der Escape-Funktion, Zeichen in die Abfrage, die alles durcheinander bringen. Vielleicht möchten Sie Ihre serialize() in base64_encode()-Aufrufe verpacken und dann base64_decode() verwenden, bevor Sie unserialisieren.

den Code für diese Situationen angepasst:

$title = base64_encode(serialize($array) );
$title = unserialize(base64_decode($mysql_data) );

6voto

bmdhacks Punkte 15405

Hier gibt es eigentlich nur zwei vernünftige Möglichkeiten:

Verbindung mit einer anderen Tabelle
Vorteile: unbegrenzte Titel in unbegrenzten Sprachen
Nachteile: Overhead bei der Verknüpfung ist rechenintensiver, SQL ist geringfügig komplexer beim Aktualisieren/Einfügen usw.

Mehrere Spalten
z.B.: TITLE_EN, TITLE_NL, TITLE_DE
Vorteile: schnelles Einfügen, Auswählen, etc.
Nachteile: begrenzte Anzahl von Sprachen, das Hinzufügen weiterer Sprachen ist eine ALTER TABLE

Wenn wir zwei Möglichkeiten haben, sollten Sie sich in der Regel für die erste entscheiden. Sofern Sie nicht gerade mit einer obszönen Menge an Transaktionen zu tun haben, die nicht parallelisiert werden können, oder Sie absosmurfly sicherstellen können, dass Sie niemals Sprachen hinzufügen werden, wird Ihnen die zusätzliche Flexibilität beim Schema-Layout auf lange Sicht Kopfschmerzen ersparen.

2voto

Cade Roux Punkte 85601

Arrays verletzen Normalisierung; in meiner Erfahrung mit Internationalisierung Datenbanken habe ich festgestellt, dass mit einem die Phrasen normalisiert ist das beste Design,

Mit I können Sie ganz einfach Großhandelskopien von Zeilen erstellen - zum Beispiel 'es' in 'es-mx' oder 'en' in 'en-US', 'en-GB' und mein Favorit: 'xx-piglatin'. In einem Array-Schema müssten Sie entweder jeden Datensatz neu schreiben oder ein komplexes Parsing hinzufügen oder etwas Komplexeres als Arrays verwenden, wie XML.

Es ist relativ einfach zu benutzen LEFT JOIN s für die Suche nach unübersetzten Phrasen für die Arbeit und auch für die Verwendung COALESCE einen Standardwert zurückgeben, damit das Programm auch dann verwendet werden kann, wenn die Phrase nicht übersetzt wird.

1voto

sebthebert Punkte 11590

Verwenden Sie eine Tabelle mit 3 Spalten!

ID, TITEL_DE, TITEL_NL

Es gibt keinen guten Grund, das zu serialisieren, WIRKLICH!

0voto

rémy Punkte 926

Es gibt den JSON-Datentyp, der auch "Arrays" speichern kann.

https://dev.mysql.com/doc/refman/8.0/en/json.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X