Jest to klasyczny projekt OO do niedopasowania impedancji tabel relacyjnych. Opisany projekt tabeli jest znany jako „tabela na podklasę”. Trzy najpopularniejsze projekty są kompromisami w porównaniu z tym, jak Twoje obiekty faktycznie wyglądają w Twojej aplikacji:
- Tabela według klas betonu
- Tabela według hierarchii
- Tabela na podklasę
Projekt, którego nie lubisz — „gdzie tabele mają 100 kolumn, a większość wartości ma wartość NULL” — to 2. jedna tabela przechowująca całą hierarchię specjalizacji. Jest to najmniej elastyczne z różnych powodów, w tym - jeśli Twoja aplikacja wymaga nowej podklasy, musisz dodać kolumny. Projekt, który opisujesz, znacznie lepiej dostosowuje się do zmian, ponieważ możesz go rozszerzyć, dodając nową tabelę podklasy opisaną wartością w product_type.
Pozostała opcja - 1. Tabela na konkretną klasę - jest zwykle niepożądana ze względu na duplikację związaną z implementacją wszystkich wspólnych pól w każdej tabeli specjalizacji. Chociaż zaletą jest to, że nie trzeba wykonywać żadnych łączeń, a tabele podklas mogą znajdować się nawet w różnych instancjach bazy danych w bardzo dużym systemie.
Opisany przez Ciebie projekt jest całkowicie opłacalny. Poniższa odmiana pokazuje, jak mogłoby to wyglądać, gdybyś używał narzędzia ORM do wykonywania operacji CRUD. Zwróć uwagę, że identyfikator w każdej tabeli podklasy JEST wartością FK tabeli nadrzędnej w hierarchii. Dobry ORM będzie automatycznie zarządzał poprawną tabelą podklas CRUD na podstawie wartości wartości dyskryminatora w samych product.id i product.product_type_id. Niezależnie od tego, czy planujesz używać ORM, czy nie, spójrz na połączoną dokumentację podklas Hibernate, choćby po to, aby zobaczyć podjęte przez nich decyzje projektowe.
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
..