2012-04-04 2 views
2

Sagen wir, ich habe zwei Tabellen: Category und Product und Product Links zu Category mit einem Fremdschlüssel Production.categoryId == Category.id. Ich möchte, dass mein Datenbankserver sich darum kümmert, die Anzahl der Produkte in einer Kategorie mit dem denormalisierten Feld Category.productCount zu zählen - die Trigger aktualisieren diese Zählung bei jeder Aktualisierung/Löschung/Einfügung, so dass ich mich nicht darum kümmern muss. Gibt es eine Möglichkeit, datenbankseitige Auslöser irgendwie mit Doctrine2-Entitäten zu synchronisieren? Ich möchte diese Zähler auf PHP-Seite nicht neu berechnen, da wir sie auf mehreren Servern ausführen werden.Doctrine2 und Datenbank-Seite löst für denormalisierter Felder

Antwort

1

Wenn ich die Frage verstehe, dass Sie in der Lage sein möchten, ein neues Produkt zu einer Kategorie hinzuzufügen, persistieren Sie es dann Category.productCount Update selbst aus der Datenbank? Sie können verwenden

$entityManager->refresh($category); 

Um eine Entität von der Datenbank neu zu laden. Ich habe es selbst nicht getan, aber ich würde erwarten, dass Sie die Lebenszyklus-Funktionalität verwenden können, um dies zu automatisieren.

Aber ich frage mich, ob es nicht besser sein könnte, den Zähler nur lokal zu erhöhen, ohne ihn in der Datenbank zu belassen. Lassen Sie Ihren Trigger die Datenbankoperation ausführen, aktualisieren Sie die Anzahl jedoch innerhalb der Anforderung lokal.

+0

Das klingt nach einer guten Idee, danke! Das einzige Problem, das ich sehe, ist, dass Doctrine die denormalisierten Felder mit jeder Insert- oder Update-Anweisung an die Datenbank sendet ... Gibt es eine Möglichkeit, Doctrine mitzuteilen, dass ein Feld in diesem Sinne "schreibgeschützt" ist? Sonst kann ich einen Trigger auf der Serverseite haben, der denormalized counts auf Einfügungen und Updates ignoriert ... was auch funktionieren würde, denke ich;) – KOHb

+0

Ich bin mir nicht sicher über das nur lesen. Möglicherweise ist es besser, eine Änderungsverfolgungsrichtlinie zu verwenden, z. B. explizite explizite http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/change-tracking-policies.html, und vermeiden Sie einfach, die Kategorie beizubehalten Objekt vollständig. – Cerad

Verwandte Themen