2017-07-15 3 views
1

Ich bin neu in Datenbanken und MySQL insbesondere. Angenommen, ich muss flache Schlüsselwertdatenstrukturen in MySQL speichern. Jede Datenstruktur hat einige erforderliche Felder und eine Anzahl von optionalen Feldern, die nicht im Voraus bekannt sind und häufig geändert werden können.Wie speichere ich Schlüsselwertpaare in MySQL?

Ich muss alle Datenstrukturen von einem der erforderlichen Felder abrufen und wahrscheinlich löschen.

So würde Ich mag diese Daten speichern Strukturen in einer Tabelle wie folgt aus: (nur eine Copy-Paste aus dem Internet eher als Arbeitscode)

CREATE TABLE my_data_structures (
    my_data_structure_id INT  NOT NULL, 
    my_required_field1 VARCHAR NOT NULL, 
    my_required_field2 INT  NOT NULL, 
    PRIMARY KEY (my_data_structure_id) 
) 

CREATE TABLE my_optional_fields (
    my_optional_field_name VARCHAR NOT NULL, 
    my_optional_field_value VARCHAR NOT NULL, 
    FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id) 
) 

Ist dieser Ansatz sinnvoll? Wie definiert man die primary key für die zweite Tabelle?

+0

Werfen Sie einen Blick auf [EAV-Modell] (https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) –

+0

@PaulSpiegel Danke. Ich habe es nur ein bisschen gegoogelt. Viele Leute sagen "EAV" ist BÖSE. – Michael

+0

Es ist leicht zu sagen, etwas ist böse, ohne eine geeignete Alternative zu bieten. Allerdings - ich sage nicht, dass du EAV benutzen solltest - ich sage, was du versuchst zu tun ** ist ** ein EAV-Modell. –

Antwort

1

Für die zweite Tabelle, würde ich empfehlen:

  • eine explizite automatische Primärschlüssel hinzufügen.
  • erklären die Länge der varchar
  • my_data_structure_id
  • einen

Das Ergebnis ist unique Zwang haben erklärt so etwas wie:

CREATE TABLE my_optional_fields (
    my_optional_fields_id int auto_increment primary key, 
    my_data_structure_id int not null, 
    my_optional_field_name VARCHAR(255) NOT NULL, 
    my_optional_field_value VARCHAR(255) NOT NULL, 
    FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id) 
    UNIQUE (my_data_structure_id, my_optional_field_name, my_optional_field_value) 
); 

Ich vermute, dass die eindeutige Einschränkung auf die ist Paar. Wenn Sie jedoch nur ein Feld mit einem bestimmten Namen möchten, schließen Sie den Wert aus der unique-Einschränkung aus.

+1

Und wenn 'my_optional_field_name' optional ist, wollen Sie wahrscheinlich nicht ** NOT NULL ** für das oder' my_optional_field_name' – RiggsFolly

+0

IMHO der UNIQUE KEY sollte '(my_data_structure_id, my_optional_field_name)' sein. –

+0

@PaulSpiegel. . . Du hast Recht. –

1

ich über die Gefahren von EAV häufig warnen, aber ich sage nicht, es ist EVIL. Es ist nur grundsätzlich nicht relational, so eine Sprache wie SQL verwenden, ist relationale Daten zu speichern und Abfrage ausgelegt ist immer umständlich und ineffizient sein würde.

Verwendung EAV, wenn es keine andere Option ist, aber seien Sie gewarnt, dass Sie verpflichten sich zu mehr Arbeit, wenn Sie EAV verwenden. Ihre Abfragen werden komplexer, Sie verlieren die Möglichkeit, dass der Datenbankserver Einschränkungen auferlegt, und so weiter.

Eine Alternative ist eine Art von nicht-relationalen Datenbank, wie ein Dokumentspeicher zu verwenden, so dass Sie bei Bedarf eine Reihe von benutzerdefinierten Felder einfügen können.

MySQL bietet die JSON data type, so dass Sie eine Art Hybrid-Modus haben, wo Sie konventionelle Spalten mit SQL-Datentypen für Attribute, die Sie immer benötigen, und dann JSON für dynamische Attribute verwenden können.