Toto je klasický OO design s nesouladem impedance relačních tabulek. Návrh tabulky, který jste popsali, je známý jako „tabulka na podtřídu“. Všechny tři nejběžnější návrhy jsou kompromisy ve srovnání s tím, jak vaše objekty skutečně vypadají ve vaší aplikaci:
- Tabulka podle konkrétní třídy
- Tabulka podle hierarchie
- Tabulka podle podtřídy
Design, který se vám nelíbí – „kde tabulky mají 100 sloupců a většina hodnot je NULL“ – je 2. jedna tabulka pro uložení celé hierarchie specializace. To je nejméně flexibilní ze všech možných důvodů, včetně – pokud vaše aplikace vyžaduje novou podtřídu, musíte přidat sloupce. Návrh, který popisujete, se mnohem lépe přizpůsobuje změnám, protože jej můžete přidat a rozšířit přidáním nové tabulky podtříd popsané hodnotou v product_type.
Zbývající možnost – 1. Tabulka na konkrétní třídu – je obvykle nežádoucí, protože implementace všech společných polí v každé tabulce specializace je duplicitní. I když výhodou je, že nebudete muset provádět žádná spojení a tabulky podtříd mohou být dokonce na různých instancích db ve velmi velkém systému.
Design, který jste popsal, je naprosto životaschopný. Níže uvedená varianta ukazuje, jak by to mohlo vypadat, kdybyste k provádění operací CRUD používali nástroj ORM. Všimněte si, že ID v každé tabulce podtříd je hodnotou FK pro nadřazenou tabulku v hierarchii. Dobrý ORM bude automaticky spravovat správnou tabulku podtříd CRUD na základě hodnoty hodnot diskriminátoru pouze v product.id a product.product_type_id. Ať už plánujete používat ORM nebo ne, podívejte se na připojenou dokumentaci podtřídy hibernace, třeba jen proto, abyste viděli návrhová rozhodnutí, která učinili.
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
..