Frage

Ich versuche, einige Daten, um sicherzustellen, wird automatisch gelöscht, wenn gibt es keine weiteren Artikel mit Kaskade löscht. Ich werde erklären, mit einer fälscht Datenbank basierend auf Stack-Überlauf.

Ich habe einen Post Tisch. Jeder Beitrag hat null bis viele Tags.

So sollte es aussehen:

  

Post <-> PostTags <-> Tags

zB.

  

Nach 1 hat Tags 'A', 'B', 'C' Beitrag 2   hat Tags 'C', 'D'.

jetzt, was ich tue, ist, dass, wenn ich für die Zeit nach 2 alle Tags löschen (zB. DELETE FROM PostTags WHERE PostId = 2), würde ich Tag ‚D‘ wie auch gestrichen werden, weil sonst niemand, wenn es zu verweisen. Ich dachte Kaskade Löschungen damit umgehen würde, aber es ist natürlich nur dann, wenn u von Tag->PostTags oder Post->PostTags kaskadieren.

Ich bin mir nicht sicher, wie diese zu behandeln.

Ich habe Angst, dass die Menschen legen nahe, einen Trigger :( (zusätzliche Komplexität des Systems) verwendet wird.

Die Gedanken?

. Hinweis: DB ist MS SQL2008

War es hilfreich?

Lösung

Leider werden Sie nicht in der Lage sein, Kaskaden hier zu verwenden. Cascades funktioniert nicht, wenn Sie eine many-to-many-Beziehungen haben, weil Sie nicht einen singulären Elternteil, den das Kind verweist (in diesem Fall mehr PostTags Einträge hast, die die Stichwort Tabelle verweisen könnten).

Trigger wäre ein Weg, dies zu tun, aber ich würde es nicht empfehlen. Vielmehr würde ich, dass in der Datenschicht vorschlagen, nachdem Sie die Einträge in der PostTags Tabelle gelöscht, löschen Sie die Stichworte, die nicht mehr referenziert werden. Wenn Sie eine gespeicherte Prozedur haben, die das Löschen des Eintrags der Fall ist, sollten Sie es tun, dies zu betrachten (es wäre relativ einfach zu sein, wie gut zu tun).

Andere Tipps

Ich glaube, Sie haben eine auf DELETE-Trigger auf Ihren Beiträgen Tabelle verwenden, die die Tags der Post überprüft werden gelöscht und löscht sie, wenn sie nicht (in der PostTags Tabelle) verwiesen werden.

Bevor Sie Ihren Beitrag zu löschen, um diese Re-Cord speichern:

SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;

Dann, nachdem Sie löschen, Schleife durch diese recordsoet und wenn count (*) = 1 ist, dann den Tag löschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top