Ich habe eine grundlegende CRUD Web App, wo Menschen Artikel erstellen/bearbeiten können. Ich möchte jetzt die Möglichkeit hinzufügen, Revisionshistorien aller Bearbeitungen zu behalten. Derzeit hat ich einen Artikel Tabelle, die wie folgt aussieht:Normalisieren oder Denormalisieren zum Speichern von Revisionsverläufen in einem RDBMS?
Article(id, title, content, author_id, category_id, format)
I 2 Optionen in Betracht gezogen habe mein aktuelles Schema zum Ändern Unterstützung für Revisionsgeschichte hinzuzufügen. Grundidee ist, dass jede einzelne Bearbeitung für einen Artikel als Datensatz in einer Revisionstabelle gespeichert wird. Also Artikel und Revisionen ist eine Eins-zu-viele-Beziehung.
Erste Option (normalisiert): Eine Tabelle für Artikelmetadaten, eine für Revisionen. Keine doppelten Daten gespeichert.
Article(id, title, category_id)
Revision(id, content, author_id, format)
2. Option (de-normalisiert): Zwei Tabellen wie Option 1, aber mit einigen doppelten Spalten.
Article(id, title, content, author_id, category_id, format)
Revision(id, article_id, content, author_id, format)
Ich denke, mit der zweiten Option zu gehen, weil es meine Codierung viel einfacher (weniger komplex, weniger Codezeilen) machen. Ich weiß, dass es nicht "akademisch" und "rein" ist, aber mein persönliches Gefühl ist, dass das Hinzufügen von zusätzlichen Joins die Code-Pflege beeinträchtigen würde. Außerdem sollte die Performance besser sein, da nicht so viele Joins durchgeführt werden müssen.
Ist dies ein guter Weg, um diese Aufgabe zu bewältigen? Möglicherweise irgendwelche unvorhergesehenen oder langfristigen Folgen, die ich übersehen habe?
JNK ist richtig (obwohl nicht SQL in SE für Joins optimiert ist - RDBMS sind. Detail aber). Wir haben ein ähnliches Problem für unsere Fakturierungsanwendung, aber dort ist die Tabelle "history" eine exakte Kopie der Rechnungstabelle mit einigen zusätzlichen Feldern (History PK, timestamp, etc). Einfach zu 'INSERT IN HISTORY SELECT NULL, JETZT(), ..., i. * Von Rechnungen i' – Konerak