Du hast Module und Gruppen. Und die stehen in einer n zu n Beziehung. Also Gruppen können Beziehungen zu mehreren Modulen haben (das kann dein gerade angedachtes Model gerade nicht) und umgekehrt (das ginge).
Ich bringe da mal ein paar (meine) Best Practises beim Tabellendesign unter. Ich erhebe da aber keinerlei Anspruch auf ~Wahrheit~. Die entsprechen auch nicht was üblicherweise in einem DB Buch als BestPractides zu finden ist. Die stammen ja da auch üblicherweise von DB Experten und nicht von Programmieren die auch irgendwie mit dem System arbeiten müßen
Das sind also hier meine Best Practises aus Programmierer Sicht.
a.) Jede Tabelle sollte eine eigenen Primary Key haben. Innerhalb einer Datenbank am besten immer vom gleichen Typ und Art (also wenn Autoincrement dann immer Autoincrement, wenn mit einem Generator dann immer, wenn vom Typ x dann immer Typ x). Das Einhalten eines Musters läßt dir in Zukunft immer die Möglichkeit für zukünftige Erweiterungen generische Lösungen zu schreiben die bei allen Tabellen funktionieren.
b.) Der PrimaryKey sollte den Tabellennamen enthalten das macht es einfacher lesbares SQL zu schreiben wenn alles ID heißt bist du an vielen Stellen sonst gezwungen den Tabellenamen auch anzugeben.
(Klingt so als würde es a.) wiedersprechen. Stimmt aber denn Gewinn erachte ich hier höher als denn Verlust
)
c.) ForeignKeys sollten so heißen wie der PrimaryKey auf den er verweist. Davon sollte man nur abweichen wenn eine Tabelle mehrere Foreignkeys auf die gleiche Tabelle hat. Auch ein Punkt aus der Lesbarkeit Ecke.
d.) Für TabellenName entscheide dich eindeutig immer für Plural oder Singular. Nicht anfangen zu mischen. Gerade wenn es um den PK geht. Also Tabelle im Plural(Module) den PK aber in Singular (ModulId)
Dann jetzt zu denn eigentlichen Tabellen. Da es eine n zu n Beziehung ist bietet sich an Zwischen Modul und Gruppe eine Mapping Tabelle zu haben.
Also
Tabelle Modul
ModulId(PK) long, ModulName varchar(50), Beschreibung varchar(50)
Tabelle Gruppe
GruppeId(PK) long, GruppeName varchar(50), Beschreibung varchar(50)
Tabelle ModulGruppe
ModulGruppeId(PK) long, GruppeID(FK) long, ModulID(FK) long