Ini adalah desain OO klasik untuk ketidakcocokan impedansi tabel relasional. Desain tabel yang Anda jelaskan dikenal sebagai 'tabel per subkelas'. Tiga desain yang paling umum semuanya merupakan kompromi dibandingkan dengan tampilan objek Anda yang sebenarnya di aplikasi Anda:
- Tabel per kelas beton
- Tabel per hierarki
- Tabel per subkelas
Desain yang tidak Anda sukai - "di mana tabel memiliki 100 kolom dan sebagian besar nilainya NULL" - adalah 2. satu Tabel untuk menyimpan seluruh hierarki spesialisasi. Ini adalah yang paling tidak fleksibel untuk semua jenis alasan, termasuk - jika aplikasi Anda memerlukan sub-kelas baru, Anda perlu menambahkan kolom. Desain yang Anda gambarkan mengakomodasi perubahan dengan lebih baik karena Anda dapat menambahkan perluasannya dengan menambahkan tabel sub-kelas baru yang dijelaskan oleh nilai di product_type.
Pilihan yang tersisa - 1. Tabel per kelas beton - biasanya tidak diinginkan karena duplikasi yang terlibat dalam menerapkan semua bidang umum di setiap tabel spesialisasi. Meskipun demikian, keuntungannya adalah Anda tidak perlu melakukan penggabungan apa pun dan tabel sub-kelas bahkan dapat berada di instance db yang berbeda dalam sistem yang sangat besar.
Desain yang Anda gambarkan sangat layak. Variasi di bawah ini adalah tampilannya jika Anda menggunakan alat ORM untuk melakukan operasi CRUD Anda. Perhatikan bagaimana ID di setiap tabel sub-kelas ADALAH nilai FK ke tabel induk dalam hierarki. ORM yang baik akan secara otomatis mengelola CRUD tabel sub-kelas yang benar berdasarkan nilai nilai diskriminator di product.id dan product.product_type_id saja. Baik Anda berencana menggunakan ORM atau tidak, lihat dokumentasi sub-kelas hibernasi yang tergabung, jika hanya untuk melihat keputusan desain yang mereka buat.
product
=======
id INT
product_name VARCHAR
product_type_id INT -> Foreign key to product_type.product_type_id
valid_since DATETIME
valid_to DATETIME
magazine
========
id INT -> Foreign key to product.product_id
title VARCHAR
..
web_site
========
id INT -> Foreign key to product.product_id INT
name VARCHAR
..