Masalah terbesar yang saya miliki dengan INHERITS
PostgreSQL implementasinya adalah Anda tidak dapat menetapkan referensi kunci asing ke tabel induk. Ada banyak kasus di mana Anda perlu melakukan itu. Lihat contoh di akhir jawaban saya.
Keputusan untuk membuat tabel, tampilan, atau pemicu di luar Rails adalah keputusan yang sangat penting. Setelah Anda memutuskan untuk melakukan itu, maka saya pikir Anda sebaiknya menggunakan struktur terbaik yang dapat Anda temukan.
Saya telah lama menggunakan tabel induk dasar, menerapkan subtipe terputus-putus menggunakan kunci asing. Struktur ini menjamin hanya satu asosiasi yang dapat eksis, dan bahwa asosiasi tersebut diselesaikan ke subtipe yang tepat di tabel induk. (Dalam slideshow Bill Karwin tentang antipattern SQL , pendekatan ini dimulai pada slide 46.) Ini tidak memerlukan pemicu dalam kasus sederhana, tetapi saya biasanya menyediakan satu tampilan yang dapat diperbarui per subtipe, dan memerlukan kode klien untuk menggunakan tampilan. Di PostgreSQL, tampilan yang dapat diperbarui memerlukan penulisan pemicu atau aturan. (Versi sebelum 9.1 memerlukan aturan.)
Dalam kasus yang paling umum, subtipe yang terpisah tidak memiliki jumlah atau jenis atribut yang sama. Itu sebabnya saya suka tampilan yang dapat diperbarui.
Warisan tabel tidak portabel, tetapi struktur semacam ini. Anda bahkan dapat mengimplementasikannya di MySQL. Di MySQL, Anda harus mengganti batasan CHECK dengan referensi kunci asing ke tabel satu baris. (MySQL mem-parsing dan mengabaikan batasan CHECK.)
Saya tidak berpikir Anda perlu khawatir tentang duplikasi data. Pertama-tama, saya cukup yakin data tidak diduplikasi antara tabel induk dan tabel pewarisan. Itu hanya muncul seperti itu. Kedua, duplikasi atau data turunan yang integritasnya sepenuhnya dikendalikan oleh dbms bukanlah pil pahit yang harus ditelan. (Tapi tidak terkendali duplikasi adalah.)
Pikirkan apakah penghapusan harus dilakukan secara bertahap.
- Sebuah contoh publikasi dengan kode SQL.
- A contoh "pesta" dengan kode SQL.