Ich möchte das Geschlecht eines Benutzers in einer Datenbank mit möglichst geringen Kosten (Größe / Leistung) speichern.
Bisher kommen 3 Szenarien in den Sinn
- Int - ausgerichtet mit Enum im Code (1 = männlich, 2 = weiblich, 3 = ...)
- char (1) - Speichern Sie m , f oder eine andere Einzelzeichen-ID
- Bit (Boolescher Wert) - Gibt es einen geeigneten Feldnamen für diese Option?
Der Grund , warum ich frage ist , weil diese Antwort , die erwähnt , dass Zeichen sind kleiner als booleans .
Ich möchte klarstellen, dass ich MS SQL 2008, bin mit der TUT in der Tat die Bitdatentyp haben.
sql
database-design
Marko
quelle
quelle
Antworten:
Ich würde die Spalte "Geschlecht" nennen.
Der BIT- Datentyp kann ausgeschlossen werden, da er nur zwei mögliche Geschlechter unterstützt, was nicht ausreichend ist. Während INT mehr als zwei Optionen unterstützt, benötigt es 4 Bytes - die Leistung ist bei einem kleineren / engeren Datentyp besser.
CHAR(1)
hat den Vorteil gegenüber TinyINT - beide nehmen die gleiche Anzahl von Bytes an, aber CHAR bietet eine engere Anzahl von Werten. Die VerwendungCHAR(1)
würde die Verwendung von "m", "f" usw. zu natürlichen Schlüsseln gegenüber der Verwendung von numerischen Daten machen, die als Ersatz- / künstliche Schlüssel bezeichnet werden.CHAR(1)
wird auch in jeder Datenbank unterstützt, falls eine Portierung erforderlich ist.Fazit
Ich würde Option 2 verwenden: CHAR (1).
Nachtrag
Ein Index in der Spalte "Geschlecht" würde wahrscheinlich nicht helfen, da ein Index in einer Spalte mit niedriger Kardinalität keinen Wert enthält. Das heißt, die Werte sind nicht unterschiedlich genug, damit der Index einen Wert liefert.
quelle
Hierfür gibt es bereits einen ISO-Standard. Sie müssen kein eigenes Schema erfinden:
http://en.wikipedia.org/wiki/ISO_5218
Gemäß dem Standard sollte die Spalte "Geschlecht" heißen und der "nächstgelegene" Datentyp wäre tinyint mit einer entsprechenden CHECK-Einschränkung oder Nachschlagetabelle.
quelle
In der Medizin gibt es vier Geschlechter: männlich, weiblich, unbestimmt und unbekannt. Möglicherweise benötigen Sie nicht alle vier, aber sicherlich 1, 2 und 4. Es ist nicht angemessen, einen Standardwert für diesen Datentyp zu haben. Noch weniger, um es als Booleschen Wert mit den Zuständen "ist" und "ist nicht" zu behandeln.
quelle
TinyInt
einer Aufzählung ausgerichtet gehen (wie Hugo vorschlägt) und mit mindestens 1, 2 und 3 (Andere) gehen.Not Known
, 1 =Male
, 2 =Female
, 9 =Not Specified
, die die ISO 5218- Werte widerspiegeln . Beachten Sie, dass es zwei Arten gibt : Geschlecht bei der Registrierung (normalerweise kurz nach der Geburt) und aktuell.Ein
Int
(oderTinyInt
) an einemEnum
Feld ausgerichtet wäre meine Methodik.Wenn Sie ein einzelnes
bit
Feld in einer Datenbank haben, verwendet die Zeile weiterhin ein volles Byte. Was die Platzersparnis betrifft, zahlt sich dies nur aus, wenn Sie mehrerebit
Felder haben.Zweitens haben Strings / Zeichen ein "magisches Wertgefühl", unabhängig davon, wie offensichtlich sie zur Entwurfszeit erscheinen mögen. Ganz zu schweigen davon, dass die Benutzer so gut wie jeden Wert speichern können, den sie nicht unbedingt auf etwas Offensichtliches abbilden würden.
Drittens ist es viel einfacher (und besser), eine Nachschlagetabelle für einen numerischen Wert zu erstellen, um die referenzielle Integrität zu erzwingen, und er kann 1: 1 mit einer Aufzählung korrelieren, sodass die Speicherung des Werts im Speicher paritätisch ist die Anwendung oder in der Datenbank.
quelle
Ich benutze char 'f', 'm' und 'u', weil ich das Geschlecht anhand von Name, Stimme und Konversation vermute und manchmal das Geschlecht nicht kenne. Die endgültige Entscheidung ist ihre Meinung.
Es hängt wirklich davon ab, wie gut Sie die Person kennen und ob Ihre Kriterien die physische Form oder die persönliche Identität sind. Ein Psychologe benötigt möglicherweise zusätzliche Optionen - Kreuz zu Frau, Kreuz zu Mann, Trans zu Frau, Trans zu Mann, Zwitter und Unentschlossen. Mit 9 Optionen, die nicht durch ein einzelnes Zeichen klar definiert sind, könnte ich Hugos Ratschlag einer winzigen ganzen Zahl befolgen.
quelle
Option 3 ist die beste Wahl, aber nicht alle DB-Engines haben einen "Bit" -Typ. Wenn Sie kein bisschen Zeit haben, ist TinyINT die beste Wahl.
quelle
Geben Sie hier die Linkbeschreibung ein
quelle
Ich würde mit Option 3 gehen, aber mehrere NON NULLABLE-Bitspalten anstelle von einer. IsMale (1 = Ja / 0 = Nein) IsFemale (1 = Ja / 0 = Nein)
falls erforderlich: IsUnknownGender (1 = Ja / 0 = Nein) und so weiter ...
Dies ermöglicht ein einfaches Lesen der Definitionen, eine einfache Erweiterbarkeit, eine einfache Programmierbarkeit, keine Möglichkeit, Werte außerhalb der Domäne zu verwenden, und keine Notwendigkeit einer zweiten Nachschlagetabelle + FK- oder CHECK-Einschränkungen zum Sperren der Werte.
BEARBEITEN: Korrektur, Sie benötigen mindestens eine Einschränkung, um sicherzustellen, dass die gesetzten Flags gültig sind.
quelle