![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3Connection
Geschlecht in extra Tabelle speichern?
Hallo,
ist es schlau das Geschlecht (Mann, Frau (nur zwei!)) in eine extra Tabelle zu speichern? Spart man damit Platz in der DB oder eher nicht? Würde nicht einfach ein String in der Haupttabelle mit dem Geschlecht nicht weniger Platz einnehmen als ein FK und die extra Geschlechter Tabelle? Was ist da besser? Danke! |
AW: Geschlecht in extra Tabelle speichern?
Und was ist mit den Transgenderleuten?
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Ich würde eine eigene Tabelle anlegen. Stell Dir nur vor, die Bezeichnung soll später geändert werden (z.B. "männlich" und "weiblich" statt "Mann" oder "Frau"), ist es dann günstiger, genau 2 Datensätze ändern zu müssen oder u.U. ein paar Millionen? Abgesehen davon bräuchtest Du sonst mindestens einen Check Constraint, wenn Du unterschiedliche Schreibweisen bzw. Tippfehler ausschließen willst.
|
AW: Geschlecht in extra Tabelle speichern?
Es kommt darauf an ...
Ich lege mir für solche Sachen einen eigenen Typen in der Anwendung an und sorge dafür, dass der immer nur korrekt erzeugt werden kann. Falsche Werte bei der Erzeugung oder beim Lesen aus der DB (hat jemand dran rumgefuscht) sind somit nicht möglich. In der DB kann ich also ein simples Kennzeichen (Integer, string, whatever) benutzen, die Anwendung interpretiert die Daten richtig oder haut mir eine Exception um die Ohren. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Abgesehen davon das einen weitere Tabelle mehr Platz kostet und Du noch ein INT64 brauchst um das ID zu speichern... Mavarik |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Wieso INT64? |
AW: Geschlecht in extra Tabelle speichern?
Ich habe für solche Daten eine eigene Tabelle angelegt - jedoch nicht nur für eine Wertegruppe.
Diese kann man dann auch erweitern - zum Beispiel mehrsprachig. Tabellenstruktur: GRUPPE;ID;SPRACHE;Wert;SortNr;Aktiv Daten: Geschlecht;m;de;männlich;1;True Geschlecht;w;de;weiblich;2;True JaNein;j;de;Ja;1;True JaNein;n;de;Nein;2;True ... Diese kann beliebig erweitert werden. |
AW: Geschlecht in extra Tabelle speichern?
lt. Normalisierung sollte das schon in eine eigene Tabelle. Würde ich persönlich nur in bestimmten Fällen machen: Wenn das Geschlecht nur eine optionale Angabe wäre, die in den seltensten Fällen angegeben wird und es wirklich um das letzte Byte ginge.
Ansonsten kauft man sich da nur eine aufwändigere SQL Abfrage ein. Zitat:
Zitat:
Grundsätzlich sehe ich das wie SirRufo: In der DB landet ein "Enum" das in der Anwendung dann ausgewertet wird. Werden Fremddatenschnittstellen angeboten, dann kommt ein CheckConstraint auf die Spalte, wenn primär über die eigene Anwendung Daten rein kommen, kann man die Prüfung getrost auch dem ORM überlassen. Aber: Ein allgemeines richtig oder falsch wird es auf die Frage nie geben.... |
AW: Geschlecht in extra Tabelle speichern?
Nun, von der Theorie her wäre eine eigene Tabelle nicht falsch, insbesonders wenn man an die Nichtvergabe oder eben Transgender denkt.
Platz sparen? die paar Bytes machen den Kohl nicht fett. Gruß K-H |
AW: Geschlecht in extra Tabelle speichern?
@Lemmy
Wenn ich Fremdaten unterstützen muss, dann nehme ich einen entsprechenden Value-Converter.
Delphi-Quellcode:
TFooConverter = class
public function ConvertFrom( Gender : TFooGender ) : TGender; function ConvertTo( Gender : TGender ) : TFooGender; end;
Delphi-Quellcode:
ist dann der einzige Ort in der Anwendung, der die Übersetzung kennt. Ich brauche also nur an einer Stelle die Übersetzung definieren.
TFooConverter
|
AW: Geschlecht in extra Tabelle speichern?
Man kann es auch so sehen: Es sollte eigentlich keine Anfragen geben, bei dem der Enumwert direkt als String vom Nutzer kommt. Also kann man auch problemlos eine ID benutzen (vllt. einen Char für adhoc-Anfragen). Die Übersetzungstabelle kann man dann trotzdem haben, auch wenn man sie nur einmal ausliest.
Zitat:
Idealerweise zeigt die Datenbank einer Anwendung Strings, einer anderen deren erwartete ID und der nächsten das entsprechende chinesische Schriftzeichen. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Ich verwende für solche Dinge immer eigene Tabellen. Über den Platzbedarf hab ich mir dabei nie Gedanken gemacht. Ein ordentliches Datenbankdesign ist mir deutlich wichtiger, als ein paar gesparte Byte. Bei der Tabelle kann man dann auch problemlos weitere Felder anfügen für verschiedene Zwecke:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Damit fällst du aber direkt auf die Nase, wenn dein Programm mehrsprachig werden soll. Ich mach es immer so, wie Sir Rufo es vorgeschlagen hat. Einfach eine ID festlegen. Im Programm wird dann schon das Korrekte angezeigt. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Welchen Wertebereich hat bei Dir ein AutoInc Feld? Mindestens aber ein INT32! Also ist mein Byte für 0=Nichtbelegt 1=Mann 2=Frau 3=Unbestimmt 4=Im Wandel 5=Mann unter 18 6=Frau unter 18 7=Reserviert... Deutlich platzsparender. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Deine Frage war: Zitat:
Und ob das ein gutes Datenbank Design ist oder nicht - lassen wir mal außen vor. Da gibt es hier schon unterschiedliche Meinungen. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Das Alter im Geschlecht zu speichern halte ich für keine gute Idee. In relationalen Datenbanken würde ich, wenn ich nicht gerade Dokumente speichere, niemals zwei Werte in eine Spalte schreiben. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Vielleicht hat man sich in Version 1. vertippt und will das in Version 1.1 korrigieren... Ich will bestimmt nicht durch X Datenbanken suchen um da nachträglich den richtigen Text rein zu bringen... |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Das Problem habe ich aber auch nicht, weil meine Software nur im Deutschsprachigen Raum eingesetzt wird (und es aus verschiedenen Gründen sehr unwahrscheinlich ist, dass sich das mal ändert). Allerdings habe ich teilweise noch ein Feld "sprache_id" um die Texte in diversen Sprachen durch den User pflegen zu können. Beim Beispiel mit dem Geschlecht wäre das z.B. um die Anrede für einen spanischen Kunden auf der Rechnung in seiner Landessprache machen zu können. In dem Fall muss natürlich Fallback-Mechanismen einbauen, für den Fall dass das Geschlecht in der gewünschten Sprache nicht gepflegt ist. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Vieleicht habe ich mich missverständlich ausgedrückt. Ich mache es in dem Sinne so wie du. Eine ID wird festgelegt 1=Mann 2=Frau. In der Datenbank steht also nur (0,1,2) Im Programm ist fest hinterlegt (in verschiedenen Sprachen) welches Wort zur ID angezeigt werden muss. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Ein Vertipper in der Datenbank/Anwendung ist doch nicht tragisch. Wenn in der Version 1 das Zeichen N für männlich genutzt wurde und nun in Version 1.1 das korrigiert werden soll nach M, dann baue ich das einfach in die Anwendung mit ein, dass eben das Zeichen N und M eben männlich bedeuten. Das ist auch relativ simpel, denn bei der Erzeugung des Wertes, wird dann aus dem N ein M gemacht. Fertig ist die Laube und alles wird wieder schick. Das Hauptproblem besteht in den meisten Anwendungen, dass einfach nur der repräsentierende Wert (der ist ohne Kontext) verarbeitet wird und nicht im Zusammenhang mit dem Kontext.
Delphi-Quellcode:
Benutzt man das aber mit dem Kontext zusammen, wird es klarer und einfacher im Umgang, weil man auch eine Interpretation mit einfliessen lassen kann (String mit 1 Zeichen, als Uppercase, 'N' => 'M')'M' <> 'm' <> 'N' <> 'n'
Delphi-Quellcode:
Generell ist und bleibt es natürlich eine Frage der Anwendung und des allgemeinen Kontextes, ob man eine erweiterbares oder festes Geschlechtsmerkmal benötigt. Gemeinsam bleibt allerdings der Kontext, denn nur so wird aus einem Wert eine verwertbare Information.TGender.Create( 'M' ) = TGender.Create( 'm' ) = TGender.Create( 'N' ) = TGender.Create( 'n' ) Wenn die Information erweiterbar ist, dann habe ich auch einen Foreign Key und über den wird das Update gemacht. Dann trage ich das an einer Stelle ein und die gesamte Datenbank ist wieder im Lot |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Das Geschlecht ist aus konservativer Sicht eine binärinformation: Mann/ kein Mann
bzw. aus feministisch-konservativer Sicht: Frau/keine Frau. Für ewiggestrige Katholikenmuslime (oder wahlweise auch osteuropäische Enggestirne) würde es also reichen, das Geschlecht als Bit/Boolean abzulegen. Das ist die zweitkompakteste* Art, diese Information zu verpacken. Das hat natürlich den entscheidenden Nachteil, das eine Erweiterung des eigenen Horizontes nur mit erheblichem Aufwand bei der Änderung DB-Struktur möglich ist. Da es sich hier -allgemein gesehen- um ein qualitatives** Merkmal handelt (ich bin 'A', 'B', 'C' oder 'D') würde ich auch zu einer einfachen Kodierung raten, dessen Präsentation (also Text) in einer separaten Tabelle untergebracht ist. Diese Kodierung ist ja unabhängig von der Information an sich und macht den Code nur lesbar. Hier würde ich allerdings davon abraten, in dieser 'Geschlechtertabelle' gleich noch Anrede etc. unterzubringen: Das gehört dort nicht hin: Anreden haben ja nur indirekt etwas mit dem Geschlecht zu tun, sondern eher mit dem Status der Person. Ob man hier Bytes oder Integer verwendet, ist eigentlich wurscht, weil die paar Bytes Speicherplatz den Kohl auch nicht fett machen. Besser wäre eine gleichförmige Behandlung aller qualitativer Merkmale über alle Tabellen. und eine Kodierung wie 'M' oder 'F' ist nun totaler Quark, weil dadurch die Tabelle nicht mir in 3NF ist. (*) die kompakteste Art wären zwei Tabellen, für jedes Geschlecht eine eigene Tabelle. (**) im Gegensatz zu quantitativen Merkmalen, wie Alter, Adresse etc. |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Sobald Du mit einem Reportingtool drüber musst, wirst Du glücklich sein, wenn Du nicht zig Subreports erzeugen musst. Eine vernünftige Abwägung der Vor- und Nachteile der Normalisierung solltest du schon vornehmen (ich mach mich gerade unbeliebt, ich weiss). Aber wenn man erstmal 7 Joins durchführen muss, um sowas triviales wie Personenstammdaten zusammenzubekommen, dann schätzt man die "unnormale" Form sehr. Sowohl als Supportmitarbeiter, als auch jemand der mit der weiteren Nutzung der Daten in statistischen Auswertungen à la QlikView und Reportingtools wie Crystal (heisst das noch so?) beschäftigt ist.
Sherlock |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Deine (produktiv-) DB ist fast vollständig 3NF. An die Tabellen will eh keine Sau ran, wegen der 7 Joins. Also basteln wir uns Views, die die ganzen FK-Verknüpfungen kapseln. Wupps, habe ich meine Kunden-View, die mir alles sehr schön darstellt und die 23 Untertabellen wunderbar verbirgt. Das jetzt noch mit der Auftrags-View verknüpfen, die auch wieder meine Untertabellen und FKs kapselt und -schawuppel- habe ich meine Auftragsübersicht mit einem
Code:
Ist doch sauber, oder?
select *
from Aufträge a join Kunden k on a.KundenID = k.KundenID where a.AuftragsDatum between :DateFrom and :DateTo Normalerweise transferiert man ja historische Daten aus der Produktiv-DB in eine Reporting-DB, wobei man die 3NF zugunsten einfacher Tabellen (star design vs. snowflake) aufgibt. Bei kleineren DBs lohnt sich das nicht, da verwendet man eben Views zur Darstellung. Und -natürlich- wenn das von der Performance nicht hinhaut, dann hat man (ich jedenfalls) eine redundante Tabelle (also eine Art materialized view), die per Trigger auf dem Stand gehalten wird. Das musste ich mal machen, weil die Auftragsübersicht dann doch in Echtzeit verfügbar sein musste (alle 5 Sekunden ein neuer Auftrag rein, ein bestehender abgearbeitet usw.) Aber das ist dann eine *zusätzliche* und redundante Tabelle. Beim Programmieren kapselst Du ja das rumgefriemele mit dieser blöden Schnittstelle auch in einer Klasse, damit sich der Anwender damit nicht rumschlagen muss. Wieso machst Du das nicht auch in deiner Datenbank? |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Da bin ich doch froh, dass ich für sowas immer BitFelder nehme und diese mit einen Const Array im Code verknüpfe... Mavarik |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
BTW: Was Du 'OMG' nennst, heißt in der Industrie 'Standard'. Nur mal so ;-) |
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Delphi-Quellcode:
Var
Bitfeld : Byte; begin if (BitFeld and $80) = $80 then Gender := Sprache[AktSprache,ID_Herr] else Gender := Sprache[AktSprache,ID_Frau]; if (BitFeld and $40) = $40 then Kunde := true else Kunde := false; end; |
AW: Geschlecht in extra Tabelle speichern?
Und dann hast Du Deinen Code mal nicht zur Hand, willst in der DB etwas ändern und siehst nur "komische Zahlen". Herzlichen Glückwunsch.
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Genau. Wartbarkeit ist was für Pussies. :mrgreen:
|
AW: Geschlecht in extra Tabelle speichern?
Es soll exotische Anwendungen geben, die sogenannte 'Reportingframeworks' verwenden. Gewiss, für altgediente Profis wie Mavarik ist das Kinderkram, aber Amateure wie -sagen wir- SIEMENS setzen doch tatsächlich diese Dinger ein. Da wäre es nun wirklich sinnvoll, wenn man in der Datenbank auch eine Präsentationsschicht hätte (also diese schwachsinnigen VIEW Dinger zum Beispiel), welche einem die kodierten Daten so aufbereitet, daß man die Daten mit einem Reporting-Tool deskriptiv darstellen kann (will sagen: 'Mann' statt false z.B.).
Auch absolute Nischenprodukte, wie z.B. EXCEL, könnten davon profitieren. Nebenbei sind so bitkodierte Eingeschaften nicht gerade geeignet, um nach ihnen zu selektieren. Es geht zwar, ist aber mühselig. Zitat:
|
AW: Geschlecht in extra Tabelle speichern?
Zitat:
Oder hab ich nur die Bemerkung falsch verstanden? Aber zurück zur Ausgangsfrage. War die nicht sowas wie: Geschlecht in der Personen-Tabelle mitspeichern oder separate PersonenGeschlecht-Tabelle führen, oder? |
AW: Geschlecht in extra Tabelle speichern?
Was bei solchen Diskussionen auch gerne aus den Augen gelassen wird ist, daß es unterschiedliche Schwerpunkte bei der Entwicklung von Software gibt. Frank (Mavarik) und ich, wir entwickeln Branchen-Software. Diesese Pakete werden von uns seit Jahren (Jahrzehnten) weiterentwickelt. Wir haben gar kein interesse daran, daß "andere" in der Datenbank rumspielen. Für mich ist es daher auch leichter alles im Quellcode zu definieren als in der Datenbank. Schon alleine wegen den Kommentaren, die ich im Quellcode einfügen kann. Ausserdem ist die Updatemöglichkeit um einiges einfacher, da ich mich nicht darum kümmern muss, ob bestimmte Definitionen in der Datenbank bestehen oder geändert wurden.
Auf der anderen Seite gibt es Firmen, die den Schwerpunkt auf die Datenbank setzen und immer mal wieder Software schreiben lassen um die Daten auszuwerten oder zu BEarbeiten. Das ist natürlich ein ganz anderer Ansatz. Denn in dem Fall wird ein Großteil der Geschäftslogik in der Datenbank definiert. Fazit: Es gibt nicht die "eine optimale Lösung". Unterschiedliche Ansätze -> unterschiedliche Lösungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz