Dit is een klassiek OO-ontwerp voor relationele tabellen die niet overeenkomen met impedantie. Het tabelontwerp dat u hebt beschreven, staat bekend als 'tabel per subklasse'. De drie meest voorkomende ontwerpen zijn allemaal compromissen in vergelijking met hoe uw objecten er in werkelijkheid uitzien in uw app:
- Tabel per concrete klasse
- Tabel per hiërarchie
- Tabel per subklasse
Het ontwerp dat u niet leuk vindt - "waar tabellen 100 kolommen hebben en de meeste waarden NULL zijn" - is 2. één tabel om de hele specialisatiehiërarchie op te slaan. Dit is om allerlei redenen het minst flexibel, waaronder:als uw app een nieuwe subklasse vereist, moet u kolommen toevoegen. Het ontwerp dat u beschrijft, is veel beter geschikt voor verandering, omdat u het kunt uitbreiden door een nieuwe subklassetabel toe te voegen die wordt beschreven door een waarde in product_type.
De resterende optie - 1. Tabel per concrete klasse - is meestal onwenselijk vanwege de duplicatie die gepaard gaat met het implementeren van alle gemeenschappelijke velden in elke specialisatietabel. De voordelen zijn echter dat u geen joins hoeft uit te voeren en dat de subklasse-tabellen zelfs op verschillende db-instanties in een zeer groot systeem kunnen staan.
Het ontwerp dat je beschrijft is perfect haalbaar. De onderstaande variatie is hoe het eruit zou kunnen zien als u een ORM-tool zou gebruiken om uw CRUD-bewerkingen uit te voeren. Merk op hoe de ID in elke subklassetabel de FK-waarde IS voor de bovenliggende tabel in de hiërarchie. Een goede ORM zal automatisch de juiste subklassetabel CRUD beheren op basis van de waarde van de discriminatorwaarden in product.id en product.product_type_id alleen. Of je nu van plan bent een ORM te gebruiken of niet, kijk naar de documentatie van de hibernate subklasse, al was het maar om de ontwerpbeslissingen te zien die ze hebben genomen.
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
..