Frage zu Datenbankstruktur

bnoga burr

Grünschnabel
hi leute,
ich bin gerade am erstellen einer Datenbank, hab ber noch nciht so richtig den Durchblick wie ichs machen soll.
Ich will in die Datenbank nur Objekte eintragen. Dazu gehört noch die Information, wieoft ein Objekt mit anderen Objekten verknüpft ist. Diese "Verknüpfungsinformationen" sind nicht auf irgendeine Zahl festgelegt, sodern sollten immer erweitert werden können.
Ich hab mir jetzt mal zwei vorgensweisen ausgedacht:

1. Eine Tabelle mit der Spalte Objekt (Name oder ID) und der Spalte Verknüpfungen. Diese Spalte verknüpfungen ist dann ein String in den dann alle aufgelistet sind, z.B. 1*2 2*5 etc.)
Für jedes neue Objekt braucht man eine neue zeile und für neue Verknüpfungen muss der String geändert werden

2. Ich mache für jedes Objekt eine einzelne Tabelle mit einer Spalte Anzahl und einer Spalte Verknüpfungen.
Für jedes neue Objekt wird hier ne neue Tabelle erstellt. Für jede neue Verknüpfung ne neue Zeile.
(Zusätzlich ne Tabelle als Objektindex wäre wohl auch angebracht)

Ich bin aber weder mit Methode 1 und 2 zufrieden.
1 ist irgendwie doch sehr "dirty" und außerdem sind doch strings auf 255 Zeichen beschränkt, oder? Nebenbei wird eine Tabelle mit so langen Strings doch sehr langsam.
2 braucht erstens relativ viel Speicherplatz und ist doch bei mehreren 10.0000 Objekten bestimm verdammt langsam, wenn man bedenkt dass ich so schnell wie möglich viele neue Objekte/Verknüpfungen erstellen bzw auslesen und ändern muss.

Habt ihr denn irgend einen besseren Vorschlag, wie ich das ganze realisieren kann? Ich bin über jede Antwort dankbar.

schon gespannt
bnoga burr
 
ich bin für möglichkeit 3: :)

Das ist eine normale 1 zu N Realation sowas macht man mit zwei Tabellen

Tabelle A Objekt , ID (eindeutige Zahl z.b. mit Autoincrement)

Tabelle B auch mit ID (die kann dann so oft auftauchen wie du es brauchst)
und Inhalt

Die ID von B zeigt auf ID von A
 
hmm... entweder hab ich dich jetzt komplett falsch verstanden, oder du mich (bei der Erklärung kein Wunder).
Denn ich seh irgendwie keinen richtigen Unterschied zwischen Methode 2 und 3. Die einzelne Tabelle für jedes Objekt entspräche deiner Tabelle B und der von mir erwähnte Objektindex entspräche Tabelle A. Ich schreib zur Sicherheit meinen Ansatz 2 nochmal ausführlich, ausgeplant hin Minimalbeispiel):

"Tabelle Objektindex"
| ID | Name | Zusatzinformationen|
----------------------------------------------
| 1 | xy | isadsadhsad |
| 2 | zz | rdgreer |
| etc..... |

"Tabelle 1 oder xy"
| Anzahl | ID Verknüpfung|
| 5 | 2 |
| 3 | 3 |


"Tabelle 2 oder z"
| Anzahl | ID Verknüpfung|
| 2 | 1 |

usw.

Nur hab ich halt relativ große bedenken zu diese Struktur (siehe ersten beitrag)

mfg

bnoga burr
 
nun deine tabelle 2 ist über (wird nicht gebraucht)

"Tabelle Objektindex"
| ID | Name | Zusatzinformationen|
----------------------------------------------
| 1 | xy | isadsadhsad |
| 2 | zz | rdgreer |
| 3 | aa | blablubb |
| etc..... |

"Tabelle 1"
| Anzahl | ID Verknüpfung|
| 5 | 2 |
| 7 | 2 |
| 1 | 2 |
| 3 | 3 |


in dem fall haste für id 2 = 3 Dateneinträge und für id 3 ein dateneintrag

Nachtrag : Dein Ansatz 2 nur das du nur eine Tabelle machst und nicht 100
alle die können zu einer Tabelle zusammengefasst werden da du als Unterscheidungsmerkmal die ID von deiner Objekindex Tabelle abspeicherst
 
Zuletzt bearbeitet:
Original geschrieben von melmager

in dem fall haste für id 2 = 3 Dateneinträge und für id 3 ein dateneintrag

Das Problem ist ja, dass ich für eine Objekt ID wissen will, welche anderen IDs damit verknüpft sind, dass heißt jede Objekt ID hat eine Liste mit IDs. Nochmal im text, die Information soll so sein.
ID 1 ist 3 mal mit ID2, 5 mal mit ID 8 verknüpft.
ID2 ist 2 mal mit ID 1 verknüpft.

Deshalb war die Idee ja für jede einzelne ID eine eigene tabelle mit verknüpfungen zu erstellen.
Dateneinträge wie du sie schreibst sind gar nicht vorhanden, die IDs haben nur Namen und sind eigentlich selbst schon die Daten.

Ich hoffe das Konzept wurde jetzt halbwegs klar.
Danke für deine Hilfe

Edit:
Ich hab mir jetzt dein Vorschlag nochmal durchgelesen und es würde sogar gehen, aber dafür bräcuhte die tabelle 1 dann ne dritte Spalte:
"Tabelle 1"
| ID | Anzahl | ID Verknüpfung|
| 1 | 3 | 2 |
| 1 | 2 | 3 |
| 2 | 1 | 4 |
| 2 | 2 | 3 |
| 3 | 1 | 6 |

Das sagt mir dann, dass ID 1 3 mal mit ID 2 und 2 mal mit ID 3 verknüpft wird usw.
In Ansatz zwei hätte ich jetzt alles was unter ID 1 steht in Tabelle 1 gepackt, was unter ID 2 steht (wird ja noch viel mehr) in Tabelle 2 usw. Dadurch hätte ich mir die erste Spalte gespart. Besonders bei vielen verschiedenen Verknüpfungen pro ID hätte das einiges an Speicherplatz eingespart.
Aber ich schätze, dass dafür diese eine tabelle hier um einiges schneller ist, oder?
 
Zuletzt bearbeitet:
Zumindes ist die Lösung mit einer Tabelle einfacher
Das Zugriffstempo ist eigendlich gleich -

Auf eins solltes du noch ein Auge werfen:
So wie ich es im Moment sehe Verweisen
dein "Id" und "ID Verküpfung" der Tabelle 1
auf den gleichen Datensatz Objektindex.

dann Kommt es zu sowas:

| ID | Anzahl | ID Verknüpfung|
| 1 | 3 | 2 |
| 2 | 2 | 1 |

ID 1 verweist 3 mal auf ID 2 und
ID 2 verweist 2 mal auf ID 1

Nu musst du das eventuell Programm technisch abfangen
Wenn die Hinverweise gleichwertig den Rückverweisen sind,
muss du ja die DB Daten entspechend angleichen
 
Wenn Hinverweise und Rückverweise unterschiedllich sind, hat das keine neg Auswirkungen.

Ich hab jetzt aber das ganze System noch mal durchdacht und bin zu dem Schluss gekommen, dass in meinem Fall Hinverweis und Rückverweis immer gleich sind. Deshalb hab ich jetzt beschlossen, das "ID" und "ID Verknüpfung" gleichwertig sind (von ihrere bedeutung), so spare ich auch jeweils eine Zeile, da ich logischerweise nicht alles doppelt schreiben muss (Bsp 1 hat 3*2; 2 hat 3*1).

Mir ist auch aufgefallen, dass meine Tabelle relativ schnell "explodiert", so ergeben schon nur 20 miteinander verknüpfte Objekte schon (20^2+20)/2=210 Einträge.
Naja, ich hoffe das SQL so ein paar 10 tausende schon aushält.

Vielen Dank für deine Hilfe
 

Neue Beiträge

Zurück