Das größte Problem habe ich mit PostgreSQLs INHERITS
Implementierung besteht darin, dass Sie keine Fremdschlüsselreferenz auf die übergeordnete Tabelle festlegen können. Es gibt viele Fälle, in denen Sie dies tun müssen. Siehe die Beispiele am Ende meiner Antwort.
Die Entscheidung, Tabellen, Ansichten oder Trigger außerhalb von Rails zu erstellen, ist die entscheidende. Sobald Sie sich dafür entschieden haben, können Sie meiner Meinung nach genauso gut die beste Struktur verwenden, die Sie finden können.
Ich habe lange eine übergeordnete Basistabelle verwendet, um disjunkte Untertypen mithilfe von Fremdschlüsseln zu erzwingen. Diese Struktur garantiert, dass nur eine Assoziation existieren kann und dass die Assoziation in den richtigen Untertyp in der übergeordneten Tabelle aufgelöst wird. (In Bill Karwins Slideshow über SQL-Antipatterns , dieser Ansatz beginnt auf Folie 46.) Dies erfordert in den einfachen Fällen keine Trigger, aber ich stelle normalerweise eine aktualisierbare Ansicht pro Untertyp bereit und benötige Client-Code, um die Ansichten zu verwenden. In PostgreSQL erfordern aktualisierbare Ansichten das Schreiben von Triggern oder Regeln. (Versionen vor 9.1 erfordern Regeln.)
Im allgemeinsten Fall haben die disjunkten Subtypen nicht die gleiche Anzahl oder Art von Attributen. Deshalb mag ich aktualisierbare Ansichten.
Die Tabellenvererbung ist nicht portabel, aber diese Art von Struktur ist es. Sie können es sogar in MySQL implementieren. In MySQL müssen Sie die CHECK-Einschränkungen durch Fremdschlüsselreferenzen auf einzeilige Tabellen ersetzen. (MySQL analysiert und ignoriert CHECK-Einschränkungen.)
Ich denke nicht, dass Sie sich um die Datenduplizierung kümmern müssen. Erstens bin ich mir ziemlich sicher, dass Daten nicht zwischen übergeordneten Tabellen und erbenden Tabellen dupliziert werden. Es scheint nur so. An zweiter Stelle die Vervielfältigung oder Abgeleitete Daten, deren Integrität vollständig vom DBM kontrolliert wird, sind keine besonders bittere Pille. (Aber unkontrolliert Vervielfältigung ist.)
Denken Sie darüber nach, ob Löschvorgänge kaskadieren sollten.
- Ein Beispiel für Veröffentlichungen mit SQL-Code.
- Ein "Partys"-Beispiel mit SQL-Code.