Hallo,
ich hätte da mal eine Frage zur best practice bezüglich "Enums" in der Datenbank und Enums in Java.
Bevor ich vor einigen Jahren angefangen habe, mich mit Java zu beschäftigen, habe ich mich einige Zeit mit Webprogrammierung beschäftigt.
Es kann natürlich sein, dass ich mit folgendem Beispiel schon falsch liege, aber ich möchte es trotzdem einmal formulieren:
Angenommen ich habe einen Benutzer, der verschiedene Rollen, wie zum Beispiel "Admin", "Moderator" oder lediglich "Benutzer" haben kann. Darüber hinaus sei angenommen, dass die Rollen später erweitert werden können, wie zum Beispiel mit "Verbannter".
Rein von dem Datenbankdesign her würde ich das lösen, indem ich eine Tabelle für die Rollen erstellen würde mit einer ID als Primärschlüssel und einem String als Namen der Rolle. Schließlich würde ich in der User-Table eine Spalte "Rolle" einführen, die den Fremdschlüssel auf die ID in der Rollentabelle enthält.
Wenn ich jetzt aber davon ausgehe, dass ich die Modellierung zunächst in Java vornehmen würde, würde ich für die Rollen ein Enum erstellen und dann in der User-Klasse ein Attribut dieses Enums einführen würde.
Angenommen, ich möchte aber dann die Persistenz der Objekte über die JPA API gewährleisten, dann könnte ich zwar mit der @Enumerated-Annotation das Enum speichern. Allerdings bietet mir die Annotation nur die Möglichkeit, die Rolle in der Datenbank entweder als String über den Namen zu speichern, was offensichtlich schlecht für spätere Änderungen in der Datenbank wäre, da stets alle Einträge mit dem entsprechenden Namen geändert werden müsste, wenn ich den Namen des Enums ändern würde.
Oder als Ordinalszahl, wobei sich mir hier die Frage stellt: Werden dabei trotzdem die Namen der Enums in einer Tabelle gespeichert, oder wird hier lediglich tatsächlich nur die Zahl gespeichert? Bei letzterem könnte ich die Datenbank ja nur bedingt exportieren, ohne die Java-Enum-Klasse mit zu exportieren, da mir ja sonst essentielle Informationen fehlen (Um später zum Beispiel zusätzlich mit einem PHP-Skript auf die Datenbank zuzugreifen).
Grüße
ich hätte da mal eine Frage zur best practice bezüglich "Enums" in der Datenbank und Enums in Java.
Bevor ich vor einigen Jahren angefangen habe, mich mit Java zu beschäftigen, habe ich mich einige Zeit mit Webprogrammierung beschäftigt.
Es kann natürlich sein, dass ich mit folgendem Beispiel schon falsch liege, aber ich möchte es trotzdem einmal formulieren:
Angenommen ich habe einen Benutzer, der verschiedene Rollen, wie zum Beispiel "Admin", "Moderator" oder lediglich "Benutzer" haben kann. Darüber hinaus sei angenommen, dass die Rollen später erweitert werden können, wie zum Beispiel mit "Verbannter".
Rein von dem Datenbankdesign her würde ich das lösen, indem ich eine Tabelle für die Rollen erstellen würde mit einer ID als Primärschlüssel und einem String als Namen der Rolle. Schließlich würde ich in der User-Table eine Spalte "Rolle" einführen, die den Fremdschlüssel auf die ID in der Rollentabelle enthält.
Wenn ich jetzt aber davon ausgehe, dass ich die Modellierung zunächst in Java vornehmen würde, würde ich für die Rollen ein Enum erstellen und dann in der User-Klasse ein Attribut dieses Enums einführen würde.
Angenommen, ich möchte aber dann die Persistenz der Objekte über die JPA API gewährleisten, dann könnte ich zwar mit der @Enumerated-Annotation das Enum speichern. Allerdings bietet mir die Annotation nur die Möglichkeit, die Rolle in der Datenbank entweder als String über den Namen zu speichern, was offensichtlich schlecht für spätere Änderungen in der Datenbank wäre, da stets alle Einträge mit dem entsprechenden Namen geändert werden müsste, wenn ich den Namen des Enums ändern würde.
Oder als Ordinalszahl, wobei sich mir hier die Frage stellt: Werden dabei trotzdem die Namen der Enums in einer Tabelle gespeichert, oder wird hier lediglich tatsächlich nur die Zahl gespeichert? Bei letzterem könnte ich die Datenbank ja nur bedingt exportieren, ohne die Java-Enum-Klasse mit zu exportieren, da mir ja sonst essentielle Informationen fehlen (Um später zum Beispiel zusätzlich mit einem PHP-Skript auf die Datenbank zuzugreifen).
Grüße