| 

.NET C# Java Javascript Exception

0
Angenommen, man will in der Datenbank Vereinsmitglieder speichern, die einen Status haben:

enum Status { Anwärter, Mitglied, Ausgeschieden }

Sollte man jetzt in der Datenbank eine Spalte haben Status int NOT NULL oder sollte man eine eigene Tabelle "Mitgliedsstatus" mit den möglichen Werten haben und per Fremdschlüssel darauf verweisen? Im ersten Fall hätte man dann den Status als enum im Code und in zweiten Fall hätte man den Status in der Datenbank.
02.09.2009
erwin.m 1 2 1
5 Antworten
2
Ein enum wird standardmäßig als Ganzzahl (System.Int32) gespeichert.
Somit ist es ausreichend ein Spalte Status int NOT NULL zu haben.
Falls es erforderlich sein sollte (zB wenn die Tabelle noch anderswertig verwendet wird) kann diese Splate auch als Fremdschlüssel für die Beziehung zu einer anderen Tabelle (mit Primärschlüssel = int) mit den "sprechenden Bezeichnungen" verwendet werden.
02.09.2009
gfoidl 9,4k 3 5
1
Was ganz klar für die Datenbank spricht ist doch, dass du, wenn ein Status hinzugefügt werden muss, deine Applikation nicht überall neu deployen musst, sondern das quasi im laufenden Betrieb machen kannst.

Eine enum im Code bedeutet, dass du deine Applikation neu verteilen musst. Bei einem PHP Script, dass nur auf einem Server läuft, ist das allerdings noch ein vertretbarer Aufwand.
07.09.2009
TheFalcon 121 1 1
1
Ich persönlich lege gern ENUMs in der Datenbank fest, wenn sie sich sehr selten oder nicht absehbar ändern. Dann lese ich in der Anwendung die Daten aus der Datenbank aus.

In deinem Beispiel würde ich in keinem Fall eine extra Tabelle anlegen, da es wohl kaum absehbar einen neuen Status gibt und jeder JOIN viel Zeit kostet.
07.09.2009
thobach 41 1 2
1
Die Antwort ergibt sich aus den Prioritäten. Wenn Performance ausschlaggebend ist (wie bei thobach und stefan.bachert), dann eben kein Fremschlüssel. Wenn die Datenkonsistenz entscheidened ist, dann gibt es zum Fremschlüssel keine Alternative. Da meistens nicht allein die Anwendung auf die Datenbank zugreift, sondern auch andere Tools, ist meines Erachtens allein ein Sicherstellen in der Anwendung nicht ausreichend.

Von einem guten/professionellen DB-Designer und DB-Admin erwarte ich die Lösung mit Fremdschlüsseln (soweit zum Thema best-practice).
10.09.2009
BeachBlocker 617 3
1
Wenn sich das Enum inhaltlich nicht ändern wird,
dann ist es OK nur mit einer int-Spalte in der Datenbank zu arbeiten zu,
und im Programm mit enums zu arbeiten,
aber bitte nur mit expliziter Zuweisung des Zahlencodes

z.B. enum Status { Anwärter=0, Mitglied=1, Ausgeschieden=3}


Wenn die Möglichkeit der Änderung besteht, dann sollte eine Datenbanktabelle existieren,
die den Zahlencode in Klartext übersetzt, am besten noch für verschiedene Sprachen.

z.B. code int; landSprache varchar (8); text varchar(255
(Primärschlüssel über "landSprache, code" bilden)
(für int den sparsamsten typ nehmen! u.U. ein CHAR)

Die Tabelle kann zu Beginn der Applikation geladen werden und kostet ansonsten keine Performance.


Von der Möglichkeit des Fremdschlüssels würde ich die Finger ganz weglassen. Das wäre zwar konzeptionell richtig (die Datennbank kennt damit Zusammenhänge), führt aber zwingend zu Performanceeinbussen ohne echten Nutzen.
11.09.2009
stefan.bachert 395 4

Stelle deine Html-Frage jetzt!