Enum-vs-Referenz-Tabelle vs-Lookup-Klasse
Während ich die Gestaltung einer MySQL-Datenbank für eine dating-website, ich bin mit dem Zweifel, wie Sie zum speichern der referenzierten Daten. Derzeit hat die Datenbank 33 Tabellen, und es gibt fast 32 verschiedene Felder, die referenziert werden. Wir müssen auch berücksichtigen, dass viele dieser Elemente, die übersetzt werden müssen.
Nach der Lektüre einige Meinungen, habe ich fast entlassen enum nutzen wie:
CREATE TABLE profile (
'user_id' INT NOT NULL,
...
'relationship_status' ENUM('Single','Married') NOT NULL,
...
);
Und normalerweise wäre ich mit einem Referenz Tabelle wie:
CREATE TABLE profile (
'user_id' INT NOT NULL,
...
'relationship_status_id' INT NOT NULL,
...
);
CREATE TABLE relationship_status (
'id' INT NOT NULL,
'name' VARCHAR(45) NOT NULL,
PRIMARY KEY ('id')
);
Aber es könnte sein, getötet zu erstellen, 32 Tabellen, so dass ich überlege, es code in PHP wie diese:
class RelationshipStatusLookUp{
const SINGLE = 1;
const MARRIED = 2;
public static function getLabel($status){
if($status == self::SINGLE)
return 'Single';
if($status == self::MARRIED)
return 'Married';
return false;
}
}
Was denkst du? Weil ich denke es könnte verbessern Sie die performance der Abfragen und auch leichter auf die Entwicklung der gesamten Website.
Dank.
- das einzige, was id sagen, ist, wenn Sie entscheiden, zu verwenden, dass die Daten außerhalb des ur php-code, option drei wird nicht viel helfen. Id-stick mit der option zwei, und ich wirklich dont denken, die Leistung ist gonna take ein Treffer überhaupt, von Referenz-Tabellen
- "Wir müssen auch berücksichtigen, dass viele dieser Elemente, die übersetzt werden müssen." Versuchen Sie nicht zu behandeln, die übersetzung auf die Datenbank-Ebene. Sollten Sie Griff diese in Ihrer PHP.
- Auch wenn Sie planen, zu implementieren, die ein ORM überhaupt, einige von Ihnen, wie die Lehre, nicht einmal Unterstützung von enum
- stackoverflow.com/questions/336846/database-enums-pros-and-cons einige gute Antworten aus einer vorherigen Instanz dieser Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definitiv eine gute Idee zu meiden ENUM IMHO: warum ENUM ist böse. Technisch eine lookup-Tabelle wäre die bevorzugte Lösung, obwohl für die einfachen Werte einer PHP-Klasse funktionieren würde. Sie müssen vorsichtig sein, dies aus den gleichen Gründen wie ENUM; wenn die Werte in Ihrem set wachsen, könnte es schwierig werden, Sie zu pflegen. (Was ist mit "nichtverheirateten", "geschieden", "GbR", "verwitwet" etc). Es ist auch nicht trivial Abfragen für Listen von Werten mithilfe von PHP-Klassen; es ist möglich, mit Reflexion aber nicht so einfach, wie eine einfache MySQL WÄHLEN. Dies ist wahrscheinlich einer der Fälle, wo ich würde nicht sorgen über die performance, bis es zum problem wird. Verwenden Sie die beste Lösung für Ihren code/Anwendung zuerst, dann optimieren, wenn Sie benötigen.
enum-Felder, die einige Probleme:
Wenn Sie einmal gesetzt sind, können Sie nicht einfach geändert werden
müssten "Zivile Partnerschaft" hinzufügen, die in diesem Land heutzutage
Kann man nicht einfach erstellen Sie eine dropdown-Liste von Optionen, von der enum listet
Jedoch Daten auf der Datenbank unterworfen werden kann, um Einschränkungen der referenziellen Integrität, so mit einer foreign key-link gegen eine Referenz-Tabelle zeigt, dass der Grad der Validierung, ohne die Zwänge eines enum.
Aufrechterhaltung der Optionen in einer Klasse erfordert eine code-änderung für alle neuen Optionen, die Hinzugefügt werden Daten, die möglicherweise erhöhen die Arbeit involviert je nach release-Verfahren, und kann nicht verhindern, dass fehlerhafte Daten in die Datenbank eingefügt.
Persönlich, ich ' D gehen für eine Referenz-Tabelle
First off, würden Sie nicht brauchen
id
undrelationship_status_id
imRelationship_status
Tabelle.Persönlich würde ich ein enum, es sei denn, Sie brauchen zu verbinden, mehr Daten als nur der name der Beziehung der person-status (oder wenn Sie sehen müssen, erweitern Sie auf diese in der Zukunft). Es wird viel leichter sein, wenn Sie die Datenbank um zu sehen, was was ist, wenn es ist in einer leicht lesbaren Sprache im Vergleich mit Abfrage eine zweite Tabelle.
Wenn Sie erwägen, Leistung, sicher, es ist schneller, zum Abfragen einer Tabelle durch eine eindeutige ID, aber Sie haben zu verfolgen, die Beziehung, und Sie werden immer verbinden mehrerer Tabellen die selben Daten bekommen. Wenn die enum-Lösung endet als langsamer, ich glaube nicht, dass es genug sein wird, dass das menschliche Gehirn in der Lage zu erkennen den Unterschied auch mit großen Datenmengen.
relationship_status_id
wurde ein Fehler beim kopieren und einfügen.