Effizientes löschen denormalisierter Datensätze
gepostet vor 18 Jahre, 4 Monate von Lunikon
Folgende Problematik: Ich habe sehr viele Datensätze B die an Datensätzen des Typs A hängen. Da ich beim Anzeigen von A nicht jedes mal alle B zählen will, um deren Anzahl zu erhalten, ist diese Anzahl als Wert in A gespeichert. Bei m schreiben von B ist das updaten dieses Werts kein Problem, da die Datensätze einzeln in die Datenbank eingefügt werden. Problematisch wird es beim Löschen: Es werden alle B unter einem bestimmten Datum auf einmal gelöscht. Meine Frage daher: Kann ich das Updaten der Denormalisierung irgendwie in das DELETE-Statement packen, so dass ich nur eine einzige Abfrage an die Datenbank schicken muss? Eine Lösung in der lediglich eine weiter Query abgesetzt wird wäre auch noch ok. Aber die Aktion ist etwas zeitkritisch, und da bei uns die Datenbank definitiv den Bottleneck darstellt, sollten so wenige Anfragen an die Db geschickt werden wie möglich.
gepostet vor 18 Jahre, 4 Monate von Toby
Keine Ahnung welche DB du benutzt, aber MySQL sollte eigentlich zurückmelden, wieviele Datensätze gelöscht wurden. Das dann via Update halt von der vorherigen Zahl abziehen und gut, oder? Wäre dann nur ein zusätzlicher Query, wie gefordert.
dev.mysql.com/doc/refman/4.1/en/delete.html
dev.mysql.com/doc/refman/4.1/en/delete.html
gepostet vor 18 Jahre, 4 Monate von exe
Vielleicht könnte man sich die denormalisierung mit Views sparen?
gepostet vor 18 Jahre, 4 Monate von Lunikon
Original von Toby
Keine Ahnung welche DB du benutzt, aber MySQL sollte eigentlich zurückmelden, wieviele Datensätze gelöscht wurden. Das dann via Update halt von der vorherigen Zahl abziehen und gut, oder? Wäre dann nur ein zusätzlicher Query, wie gefordert.
Problem hierbei ist, dass das DELETE in meinem Fall generell alle Datensätze B mit x < y löscht, also auch von verschiedenen As. Ginge also so nicht.
@exe: Habe mich noch nie mit Views beschäftigt und müsste auch erstmal herausfinden, was Hibernate mit Views anfangen kann.
gepostet vor 18 Jahre, 4 Monate von Kampfhoernchen
Die dürften normal wie Tabellen verwendet werden können. Kannst ja auch mit "normalen" SELECTs darauf zugreifen.
ggf. würde hier ein Trigger Sinn machen?
Oder danach ein Aufruf
UPDATE a SET anzahl_von_b = (SELECT COUNT(*) FROM b WHERE a.id = b.id);
ggf. würde hier ein Trigger Sinn machen?
Oder danach ein Aufruf
UPDATE a SET anzahl_von_b = (SELECT COUNT(*) FROM b WHERE a.id = b.id);
gepostet vor 18 Jahre, 4 Monate von exe
Views werden beim Abfragen genau wie normale Tabellen behandelt. Man könnte sagen, dass es virtuelle Tabellen sind deren Inhalte "on-the-fly" vom Datenbanksystem zusammengestellt werden.
Trigger wären eine andere Idee.
Ich würde bei solchen Dingen (bezieht sich jetzt auch auf das Thema "aktualisieren der Daten") generell auf die Bordmittel der Datenbanksysteme zugreifen. Sowas sind alles Aufgaben des Datenbanksystems und genau dafür benutzt man aufgemotzte Systeme wie MySQL. Wenn man nur Daten in Tabellen organisieren will kann man auch eine Excel Tabelle mit Primary Key nehmen ...
Trigger wären eine andere Idee.
Ich würde bei solchen Dingen (bezieht sich jetzt auch auf das Thema "aktualisieren der Daten") generell auf die Bordmittel der Datenbanksysteme zugreifen. Sowas sind alles Aufgaben des Datenbanksystems und genau dafür benutzt man aufgemotzte Systeme wie MySQL. Wenn man nur Daten in Tabellen organisieren will kann man auch eine Excel Tabelle mit Primary Key nehmen ...
gepostet vor 18 Jahre, 4 Monate von Lunikon
Hm, das klingt ja nicht schlecht. Habe mich eben erkundigt, Hibernate scheint Views zu unterstützen wie reguläre Tabellen auch.
Wie würde so ein View dann aussehen, bzw. kennt jemand eine gute Referenz zu dem Thema?
Wie würde so ein View dann aussehen, bzw. kennt jemand eine gute Referenz zu dem Thema?
gepostet vor 18 Jahre, 4 Monate von mifritscher
hmm, ich denke foreign keys kannst du so einstellen, dass wenn der Eintrag in Tabelle A der entsprechende Eitnrag in Tabelle B auch gleich mit gelöscht wird
gepostet vor 18 Jahre, 4 Monate von exe
Lunikon: gute Referenz nicht, aber das MySQL Reference Manual + etwas Testen sollte reichen: dev.mysql.com/doc/refman/5.0/en/views.html
mifritscher: einen DELETE zu "kaskadieren" (ON DELETE CASCADE) führt in diesem Fall nicht zum Ziel. Es soll nicht die referenzierte Zeile mitgelöscht sondern ein Counter um die Zahl der gelöschten Zeilen runtergezählt werden.
mifritscher: einen DELETE zu "kaskadieren" (ON DELETE CASCADE) führt in diesem Fall nicht zum Ziel. Es soll nicht die referenzierte Zeile mitgelöscht sondern ein Counter um die Zahl der gelöschten Zeilen runtergezählt werden.
gepostet vor 18 Jahre, 4 Monate von Lunikon
Ok, vielen Dank, ich schaus mir mal an.
gepostet vor 18 Jahre, 4 Monate von Kampfhoernchen
Aber mit ON DELETE kann man einen Trigger auslösen.