Datenbank: Entity mit vielen Referenzen? Ansatz so ok?

beta20

Top Contributor
Hallo zusammen,

mich würde heute folgendes interessieren:
Ich habe eine Entity, die viele Referenzen haben kann, also als Beispiel:
- Entity Note kann 1....n ReferenzObjekte haben

ReferenzenObjekte können sein: Angebot, Rechnung, Bild, Gutschrift
-> Im Endeffekt alle Entities meiner Anwendung (und das sind mittlerweile 70-80)

Ich könnte nun natürlich eine Tabelle ReferenzObjekte anlegen, die für jede Entity einen FK - Schlüssel hat:
Rechnung_FK, Angebot_FK usw.
-> Das Problem ist aber, dass MSSQL hier bei 64 Fremdschlüsseln ein Problem hat.

Ich habe das nun so gelöst:
ReferenzObjekte
- ID
- String EntityName
- String ObjectId

- EntityName ist dann jeweils immer di Entität. Also z.B. für "Rechnung" wird dann eben "Rechnung" als String hineingeschrieben
- ObjectId ist die ID von der Rechnung

Will ich nun die Referenz holen, suche ich mit "EntityName" und "ObjectId" und bekomme dann für Rechnung bspw:
EntityName = Rechnung
ObjectId = 1
-> die Rechnung 1.

Das funktioniert auch alles so. Aber die Frage ist für mich, kann man diesen Ansatz zu wählen oder wird mir das früher oder später ein Problem geben (Stichwort Performance bspw.) ?

Danke für die Hilfe
 

beta20

Top Contributor
Was verstehst du nicht genau?
Das ist eine Tabelle, die eben die Referenzen zu anderen Tabellen nicht als FK abspeichert, sondern eben über einen eindeutigen EntityName und der ID von dieser Tabelle....
Die entsprechende Entity wird dann eben über die EntityName und ID geladen...
 

Thallius

Top Contributor
Kannst du dein Beispiel nicht einfach mal auf 3-5 Entitäten runterbrachten und erklären was die Software da eigentlich machen soll. Ich kapier es nämlich nicht wozu man so ein Konstrukt braucht,
 

beta20

Top Contributor
Also:
- Ich habe eine Entität bzw. Tabelle "Notizen":

Eine Notiz kann zu folgenden Entitäten angehängt werden:
- Rechnung
- Angebot
- Gutschrift
- Bild
- Brief
- Kunde
- Lieferant
- Brief
- Email
- Mitarbeiter
- Urlaubsantrag
- .........

Ich kann nun natürlich für jedes dieser Entitäten einen FK in der Tabelle Notiz anlegen.
-> Ich habe aber etliche Entitäten und laufe dann in die Gefahr, dass MSSQL mir hier einen Strich durch die Rechnung macht, da ich nur 64 FK pro Entität hinzufügen kann

-> Eine eigene Notiz-Tabelle pro Entität erachte ich für Schwachsinn. Also RechnungNotiz z.B.

Daher mein Ansatz:
Tabelle ReferenceObject als Tabelle anlegen.
Diese hat:
- EntityName (hier steht dann "Rechnung")
- objectId (Id der Rechnung)

Wenn ich nun von einer Rechnung mit der ID 1 die Notizen abrufen will, dann frage ich in der WHERE Clause ab mit:
WHERE t.entityName = 'RECHNUNG' and m.objectId =1

Soweit verständlich?
 

Thallius

Top Contributor
Ah jetzt kann man das verstehen.

Dann würde ich das wahrscheinlich genauso lösen. Entityname würde ich dann aber den tabellennamen nehmen und nicht irgendeinen lokalisierten String. Aber vielleicht machst du das ja tatsächlich alles in deutsch (was in meinen Augen dann der große Fehler wäre)

Gruß

Claus
 

beta20

Top Contributor
Ok, danke.
Ich habe in jeder Entität eine Konstante als String, die mir den Namen ausgibt:
public final String ENTITY_NAME = "Offer";
Ja, die Namen sind auf Englisch.

Eine abschließende Frage:
objectId: sollte das ein Long sein (wie die ID in den jeweiligen Klassen) oder kann es auch ein String sein (Performance)?
 

mihe7

Top Contributor
Ich habe aber etliche Entitäten und laufe dann in die Gefahr, dass MSSQL mir hier einen Strich durch die Rechnung macht, da ich nur 64 FK pro Entität hinzufügen kann
Wie kommst Du auf die Einschränkung von 64? Wenn ich https://docs.microsoft.com/en-us/sq...fications-for-sql-server?view=sql-server-2017 richtig interpretiere, dann kannst Du 253 FKs je Tabelle angeben und eine Tabelle kann Teil von 10.000 FKs sein. Für Dich interessant wären ja die 10.000....

objectId: sollte das ein Long sein (wie die ID in den jeweiligen Klassen) oder kann es auch ein String sein (Performance)?
Kein String.

Mal zurück zum Problem. Du behandelst die Notiz ja wie ein Attachment, die an eine Entity angehängt wird. Wenn wir also den einfachen Fall betrachten, dann hättest Du eine Tabelle RechnungNotiz und eine Tabelle Rechnung, wobei jeder Satz in RechnungNotiz einen Satz aus Rechnung referenziert. Die Rechnung weiß gar nichts von RechnungNotiz. Gleiches würde dann für Angebot und AngebotNotiz usw. gelten.

Du willst aber nicht für jede Entity eine eigene Notizen-Tabelle, sondern alle Notizen in einer Tabelle speichern. Die Frage ist jetzt, was eine Notiz dann referenziert.

Zu diesem Zweck hast Du ein ReferenzObjekt eingeführt. Damit kannst Du den FK Notiz -> ReferenzObjekt darstellen. In ReferenzObjekt speicherst Du einen weiteren, eindeutigen Schlüssel, der sich aus dem Namen und der ID der betreffenden Entity zusammensetzt. Für diesen Schlüssel kannst Du aber keine FKs ReferenzObjekt -> Rechnung, ReferenzObjekt -> Angebot usw. anlegen.

Man kann ReferenzObjekt auch als die "Basisklasse" aller Referenzobjekte betrachten. Die Identität des konkreten Referenzobjekts, also der betreffenden Entity, ist somit durch die Identität des Referenzobjekts gegeben. Die Angabe des Tabellennamens ist "lediglich" Zusatzinfo (=> konkreter Subtyp), um gezielt Daten abrufen zu können.

Das ReferenzObjekt braucht dann nur zwei Spalten (ID und Tabellenname). Die ID der Entity ist damit immer gleich der ID des Referenzobjekts. Der FK geht dann von Entity zu ReferenzObjekt.

Beim Erzeugen einer Rechnung muss dann in einer Transaktion erst ein Referenzobjekt (soz. als ID der Entity) angelegt und dann die dazugehörige Entity gespeichert werden. Das könnte man per Trigger lösen (sofern man nicht einen ORM verwendet, der das für einen erledigt).

Hat alles Vor- und Nachteile.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
E schneller von der Datenbank abfragen Java Basics - Anfänger-Themen 15
E Datenbank Spalte zusammenzählen Java Basics - Anfänger-Themen 2
R Datenbank Java Basics - Anfänger-Themen 1
I API Key´s in der Datenbank decrypt / encrypten? Java Basics - Anfänger-Themen 23
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
M Von der Datenbank zum Textfield Java Basics - Anfänger-Themen 16
R Best Practice Logik in der Datenbank oder in Java? Java Basics - Anfänger-Themen 3
R Datenbank-Werte dynamisch ausgeben Java Basics - Anfänger-Themen 19
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
T Datenbank | Welche am Sinnvollsten? Java Basics - Anfänger-Themen 5
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Datenbank wird nicht erstellt Java Basics - Anfänger-Themen 31
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
Meeresgott OOP Gui, Logik und Datenbank richtig aufbauen Java Basics - Anfänger-Themen 43
B Schreiben von zu vielen Einträgen in einer Datenbank Java Basics - Anfänger-Themen 9
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
N Datenbank mit GUI verbinden - Wie? Java Basics - Anfänger-Themen 5
1 Datenbank in Java Java Basics - Anfänger-Themen 1
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
J Bücher Datenbank Java Basics - Anfänger-Themen 5
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
J Datum und Uhrzeit in Datenbank falsch hinterlegt Java Basics - Anfänger-Themen 13
R Erstversuch Datenbank Java Basics - Anfänger-Themen 6
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
T Sql Datenbank - variable übergeben? Java Basics - Anfänger-Themen 8
C Passwörter möglichst sicher in Datenbank speichern Java Basics - Anfänger-Themen 18
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
J GUI mit phpMyAdmin Datenbank verbinden Java Basics - Anfänger-Themen 0
K Erste Schritte Datenbank SQL erklärung Java Basics - Anfänger-Themen 15
B Lokale Datenbank Java Java Basics - Anfänger-Themen 2
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
U Datenbank in Java Java Basics - Anfänger-Themen 8
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
B Dateiname in Datenbank schreiben Java Basics - Anfänger-Themen 2
J fortlaufende Objekte durch Variable auswählen; Datenbank Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
C Datenbank - Welche Java Basics - Anfänger-Themen 5
B Java Objektorientierte Datenbank - Assoziation Hilfe Java Basics - Anfänger-Themen 4
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
J Erste Schritte Objekte in Datenbank speichern Java Basics - Anfänger-Themen 26
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
K Input/Output Datenbank Java Basics - Anfänger-Themen 27
M Datenbank in die Gui Java Basics - Anfänger-Themen 4
J JTable mit Daten aus Datenbank füllen Java Basics - Anfänger-Themen 3
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
M Brauche ich ein Datenbank oder nicht? Java Basics - Anfänger-Themen 6
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
F Classpath Datenbank ... nur wo? Java Basics - Anfänger-Themen 24
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
B Personalnummer aus Datenbank Java Basics - Anfänger-Themen 3
M Welche Datenbank? Java Basics - Anfänger-Themen 5
J RadioButtonInhalt in Datenbank übergeben Java Basics - Anfänger-Themen 3
R Datenbank bei Klassenverteilung führt zu NullPointerException Java Basics - Anfänger-Themen 7
J PW von Datenbank wie abspeichern? Java Basics - Anfänger-Themen 2
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
J Kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
T Zugangsdaten für Datenbank in Java-Programm speichern? Java Basics - Anfänger-Themen 5
S Schnittstelle für Datenbank bzw. Dateiformat Java Basics - Anfänger-Themen 2
C ComboBoxModel mit Daten der Datenbank verändern Java Basics - Anfänger-Themen 2
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
I Datenbank - nach erster Verbindung keine Verbindung mehr Java Basics - Anfänger-Themen 3
F Datenbank in eine Textdatei speichern Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben