Im allgemeinen Fall ist die zweite Tabelle anti-pattern im Kontext des Datenbankentwurfs. Und noch mehr, es hat einen spezifischen Namen: Entity-Attribut-Value (EAV). Es gibt einige Fälle, in denen dieses Design gerechtfertigt ist, aber das sind seltene Fälle - und auch dort kann es vermieden werden.
Datenintegritätsunterstützung
Trotz der Tatsache, dass eine solche Struktur "flexibler" oder "fortschrittlicher" zu sein scheint, hat dieses Design Schwächen.
"customer_name"
als Attributnamen - und ein anderer Entwickler wird das vergessen und "name_of_customer"
verwenden. Und .. es ist in Ordnung, DB wird das passieren und du wirst mit Stunden fertig sein, die für die Fehlersuche in diesem Fall ausgegeben werden. Zeilenrekonstruktion
Außerdem wird die Zeilenrekonstruktion im allgemeinen Fall schrecklich sein. Wenn Sie zum Beispiel 5 Attribute haben - das sind 5 Selbsttabellen JOIN
-s. Schade für so einen einfachen - auf den ersten Blick - Fall. Daher möchte ich mir nicht einmal vorstellen, wie Sie 20 Attribute verwalten.
Mein Punkt ist - nein. In RDBMS wird es immer einen Weg geben, dies zu vermeiden. Es ist schrecklich. Und wenn EAV verwendet werden soll, dann ist die beste Wahl nicht relationale Datenbanken.
Im zweiten Fall (Tabelle 2) ist dies komplex und es braucht viel Zeit, um Daten zu finden, wenn wir eine Abfrage machen. Dieser Fall wird verwendet, wenn Sie nicht wissen über die Anzahl der Spalten oder sie sind unterschiedlich, wenn Sie feste Länge der Spalten dann ersten Fall (Tabelle1) verwendet haben, weil in diesem Fall Daten finden schnellen Weg.
Die Tabelle mit den Spalten id
, name
, age
, birthdate
und address
ist das, was Sie verwenden, wenn Sie vor der Bereitstellung wissen, welche Informationen über eine Entität gespeichert werden sollen.
Die Tabelle mit den Spalten id
, col_name
, col_value
kann verwendet werden, wenn Sie erst nach der Bereitstellung wissen, welche Informationen über eine Entität gespeichert werden sollen (z. B. wenn nichttechnische Personen in der Lage sein sollten, Felder zu definieren sie wollen erfassen). Es ist weniger effizient, aber Sie können neue Felder definieren, ohne das Datenbankschema zu ändern.
Tags und Links sql mysql database database-design