sql >> Databáze >  >> RDS >> Mysql

Návrh databáze:objekty s různými atributy

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:

  1. Tabulka podle konkrétní třídy
  2. Tabulka podle hierarchie
  3. 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
..


  1. php - převod z jednoho formátu json do druhého

  2. 1. řada ve skupině podle vs. poslední řada

  3. Připojení k Vertica v IRI Workbench

  4. Pořadí SQL podle počtu