Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Performance Problem





Frage

Hallo Man stelle sich eine DB Tabelle mit Geschichten vor. Zu jeder Geschichte gehören Charaktere. Diese Charaktere sind wiederum seperat in einer Tabelle Charaktere abgelegt. Tabelle Geschichten | [u]id[/u] | name | ... | ... | Tabelle Charaktere | [u]id[/u] | name | Wenn ich nun eine Beziehung zwischen Geschichten und Charakteren dartsellen will lege ich normalerweise eine Dritte Tabelle an, die diese Beziehung representiert. Tabelle Geschichten-Charaktere | [u]g_id[/u] | [u]c_id[/u] | Wollte ich diese Geschichten inklusive aller zugehörigen Charaktere nun darstellen, müsste ich für jede Geschichte eine weitere Datenbank Abfrage erstellen, die mir die Namen der Charaktere zurüchgibt. [b]Nun die Frage:[/b] Wäre es im Sinne der Performance nicht besser die verschidenen Charaktere einer Geschichte in eimem Textfeld der Geschichtentabelle zu speichern? Tabelle Geschichten | [u]id[/u] | name | charaktere | ... | Dann bräuchte man nur eine SQL Abfrage um die Geschichten inklusive aller zugehörigen Charaktere anzuzeigen. Zumal das browsen der Geschichten definitiv die am häufigsten verwendete Funktion sein wird. Natürlich ist das nicht gerade im Sinne der Normalisierung, aber performance technisch wäre es doch besser? Allerdings bleibt dann zu überlegen ob man die Geschichten-Charaktere Tabelle nicht zusätlich führen sollte, da diese bei Suchanfragen nach Geschichten mit bestimmten Charakteren die bessere Wahl wäre. Vielen Dank für´s lesen und noch mehr Dank für Vorschläge.

Antwort 1 von disco

moin

ich hoffe das ich das richtig verstehe.

du überlegst die referenztabelle zwischen geschichte und charakteren wegzulassen. wenn du nur ein (nutz-) feld bei den charakteren (also den namen) kannste das machen.

aber so wie ich dich verstehe, willst du die IDs der charaktere in einem feld in der tabelle geschichte speichern (also als referenz). vorweg: das ist blödsinn. du würdest dann mit einem zugriff die IDs aus den charakteren holen, dann in deinem programm bearbeiten und dann wieder ein statement formulieren.

mit einer referenztabelle kommste mit einem db-aufruf zurecht, um an die charaktere einer geschichte zu kommen.

oder hab ich dich falsch verstanden?

g,
disco

Antwort 2 von T.A.K

Ja ich glaube du hast mich falsch verstanden.

Ich würde die Namen der Charaktere in der Geschichten Tabelle speichern, nicht die IDs.

Allerdings müsste dann die Referenztabelle definitiv geführt werden, da man sonst keine Möglichkeit hätte die Charaktere zu aktualisieren.

Zitat:
mit einer referenztabelle kommste mit einem db-aufruf zurecht, um an die charaktere einer geschichte zu kommen.

Könntest du das an eimem Beispiel erläutern oder die Abfrage in groben Zügen aufschreiben?

Vielen Dank

Antwort 3 von disco

Zitat:
Könntest du das an eimem Beispiel erläutern oder die Abfrage in groben Zügen aufschreiben?


freilich.

du hast 3 tabellen.

geschichte={id, name, sory, jahr, bla, ,,,}
charakter={id,name,beschreibung,...}
verknüpfung={id,id_gechichte,id_charakter, sonstiges}

SELECT * FROM charakter WHERE charkter.id=verknüpfung.id_charakter AND verknüpfung.id_geschichte = "Hier muss der wert hin";

g,
disco

Antwort 4 von T.A.K

Zitat:
freilich.

du hast 3 tabellen.

geschichte={id, name, sory, jahr, bla, ,,,}
charakter={id,name,beschreibung,...}
verknüpfung={id,id_gechichte,id_charakter, sonstiges}

SELECT * FROM charakter WHERE charkter.id=verknüpfung.id_charakter AND verknüpfung.id_geschichte = "Hier muss der wert hin";


Ok, das würde mir im Prinzip ein Array mit Charakteren zurückgeben, wobei ich das immer noch pro Geschichte machen müsste.
damit wären wir bei (Anzahl der Geschichten) +1 Queries insgesamt.

Würde ich die Charaktere in der Tabelle Geschichten als Text ablegen (z:b.: Hans, Peter, Inge) dann käme ich mit nur einer einzigen Abfrage aus.
Was allerdings zum nachteil hätte das ich die verknüpfungstabelle trozdem führen müsste.
Nenne ich in der Tabelle charaktere nämlich "Hans" in "Gustav" um, muss ich die Aktualisierung der Geschichten Tabelle mit Hilfe der Verknüpfungstabelle programmseitig durchführen.
Und genau da stellt sich die Frage ob der Nutzen einen solchen Mehraufwand tatsächlich rechtfertigt.