# Brauche Tipps für Datenbankdesign



## beta20 (15. Jun 2018)

Hallo zuzammen,

ich habe eine Tabelle "Activity", in der ich alle Aktivitäten speichere.
Nun ist das Problem aber, dass ich 80 FOREIGN_KEY zu allen Entities habe.

Ich habe z.B. die Entity:
- Reifen
- Speiche
- Sattel
-...

All diese Entities haben ebenfall in der Tabelle Activity einen Fremdschlüssel.

Nun ist aber mein Problem, dass mit JPA / Hibernate für jeden FK einen Index generiert und ich hier schon Mal eine Fehlermeldung bekomme.


> 21:30:47,298 INFO [stdout] (EJB default - 6) Hibernate:
> 21:30:47,298 INFO [stdout] (EJB default - 6)
> 21:30:47,298 INFO [stdout] (EJB default - 6) alter table activities
> 21:30:47,298 INFO [stdout] (EJB default - 6) add constraint FKs9qx51p69n9f7dbrmxwutfg8w
> ...



Klicke in dieses Feld, um es in vollständiger Größe anzuzeigen.
Da ich nicht immer alle Entities holen möchte, habe ich den FK jeweils so deklariert:
*@ManyToOne(optional = true, fetch = FetchType.LAZY)*

Habe ich nun aber eine Query, in welcher in alles mit "LEFT JOIN FETCH" hole, bekomme ich eine Fehlermeldung, dass ich zu viele Columns habe.

Meine Frage:
Ist die Idee überhaupt gut, dass ich so viele FK´s habe?
Wie könnte man es anders lösen?

Ich habe eine Tabelle, in der alle Aktivitäten aufgelistet werden.
Demnach brauche hier alle FK´s auch...

Danke für jede Hilfe


----------



## VfL_Freak (15. Jun 2018)

Moin,
der Fehler steht doch da: *Too many keys specified; max 64 keys allowed*

80 FKs klingt auch grundlegend schon nach falschen Aufbau!
Vermutlich solltest Du Dich mal mit dem Thema '_Normalisierung_' auseinandersetzen (http://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/)

VG Klaus


----------



## beta20 (15. Jun 2018)

Danke für den Link.
Hast Du einen Lösungsansatz, wie man sonst von einer Entity 80 andere Entities connecten kann?

Ich könnte in der Tabelle "Activity" folgendes machen:
- Eine Spalte "entity_type" haben (varchar)
- Eine Spalte key_number (long)

- In entity_type steht dann der Name der anderen Entity
- In key_number steht dann die ID, auf welche verwiesen wird.
-> In meiner WHERE Clause filtere ich dann auf entity_type = "BLABLA" and key_number="1" z.B.

In meiner HTML Liste lade ich dann immer nur die Activity. Wenn ich zum eigentlichen Objekte gehen will, dann baue ich mir einen Link ein, der dann auf die entsprechende Seite geht.
if(entity_type = 'REIFEN')
-> dann holt es mir aus der Entity "REIFEN" das Objekt mit der ID=1

Danke


----------



## Thallius (15. Jun 2018)

Ich habe ehrlich gesagt überhaupt keine Ahnung wieso man hier Fremdschlüssel braucht. So wie es aussieht willst du Fehradteile verwalten. Also hast du eine Tabelle "parts" mit den Spalten id als primary key autoincrement unique  und "name" (oder meinetwegen auch "type" und dann halt eventuell weiteren Attributen die ein Fahrradteil haben kann.

Wo braucht man da jetzt einen Fremdschlüssel=

Gruß

Claus


----------



## beta20 (15. Jun 2018)

Nein, nicht wirklich....

Ich habe eine Tabelle "Activity", diese soll alle Aktivitäten (speicher, löschen....) der anderen Entities loggen.
Also wenn Entity1 gespeichert wird, dann wird in der Activity Tabelle das gespeichert:
- ID
- Typ (create, modify, delete)
- EntityType
- User_FK (derjenige, der die Aktion durchgeführt hat)
- FK_Entity1....


----------



## Thallius (15. Jun 2018)

Ich verstehe immer noch nicht wieso du für jedes Teil eine Klasse brauchst. Pack die doch alle in eine Klasse Fahrradteil und gut ist. Alles andere wird doch total unübersichtlich im Code.


----------



## beta20 (15. Jun 2018)

Das war nur ein Beispiel mit dem Fahrrad - ich habe nichts mit irgendwelche Fahrradteilen zu tun.
Es geht um Entities wie Customer, Offer, Invoice usw usw. diese kann ich mit Sicherheit nicht in eine Tabelle / Klasse stecken..


----------



## Thallius (15. Jun 2018)

Dann würde ich es machen wie Du es oben beschrieben hast. In die Activity eine Spalte um welche Entity es sich handelt und einen Zeiger auf die Id.


----------



## mrBrown (15. Jun 2018)

Warum willst du denn alle Änderungen an allen Entitäten in einer einzigen großen Tabelle speichern?

Nimm eine Tabelle pro Entität und gut ist.
Und wenn du sowieso Hibernate nutzt, nimm doch auch gleich Hibernate Envers und das ganze passiert automatisch im Hintergrund...


----------

