sql >> Databáze >  >> RDS >> Database

Návrh databáze 101

Dobrým cvičením datového modelování pro začátečníky je vytvoření datového modelu online obchodu . Pokaždé, když dávám toto cvičení svým studentům, jsem překvapen, jak je to pro ně obtížné.

Najděte koncepty...

Podívejme se, jak to lze provést. Víme, že musíme vytvořit tabulku pro každý koncept v doméně. Přemýšlejte o podstatných jménechfráze podstatných jmen byste použili k popisu domény. Zhruba každé podstatné jméno je buď pojem, atribut pojmu nebo příklad . Jaké jsou základní pojmy v internetovém obchodě? Hned mě napadnou dvě slova:

  • zákazníci – lidé, kteří nakupují věci v našem obchodě, a
  • produkty – položky, které lidé nakupují v našem obchodě.

Každý zákazník má základní sadu údajů, které ho popisují:id (obvykle potřebujete atribut id v tabulce), jméno, email a heslo. Podobně má produkt id a název. Mohli bychom přidat více atributů pro zákazníky a produkty, ale pro účely tohoto příkladu budou stačit tyto. Přidáme dvě tabulky do našeho modelu.

... Stejně jako abstraktní pojmy

Toto je obchod, takže samozřejmě chceme vědět co bylo objednáno a kým . „Objednávka“ je klíčové slovo ve většině databází, takže bychom jej neměli používat pro název tabulky. Místo toho použijeme název purchase pro třetí stůl v našem modelu. Tabulka musí být nějak spojena s customer a na product . Pro začátek nakreslíme odkaz mezi purchase a customer a mezi purchase a product .

customer-purchase reference je v pořádku. Každý nákup provádí jeden zákazník; každý zákazník může provést několik nákupů. Tato reference zde zůstane.

S purchase-product však není něco v pořádku odkaz. V jednom nákupu lze zakoupit několik produktů; několik nákupů může zahrnovat stejný produkt. Ale naše reference umožňuje nákup pouze jednoho produktu v rámci jednoho nákupu. Smažeme referenci a zamyslíme se nad jiným způsobem, jak ji modelovat.

Jedno velké textové pole pro všechny zakoupené produkty?

Co kdybychom přidali velké textové pole, které může ukládat názvy nebo ID zakoupených produktů? Nyní si můžeme koupit několik produktů v jednom nákupu. Jsou zde však určité problémy:

  • Zaprvé je obtížné zkontrolovat, zda je produkt v purchased_items pole je skutečně v databázi.
  • Zadruhé, pokud chcete změnit název produktu (protože jste jej napsali špatně), musíte aktualizovat všechny purchased_items instance pole v purchase stůl.
  • A konečně, je obtížné analyzovat data v databázi. Pokud chcete například zjistit, který produkt se kupuje nejčastěji, musíte použít operaci podřetězec textu. A to není nikdy příliš efektivní.

Několik sloupců produktů v tabulce nákupů?

Jaké jsou další možnosti? Chceme, aby byl nákup spojen s několika produkty, takže možná bychom měli přidat několik purchase_item sloupce v nákupní tabulce? No, to je únavné (přidal jsem jen 5 sloupců a byl jsem unavený) a vytváří to umělé a hloupé omezení počtu zakoupených produktů.

Použijte přechodnou tabulku!

Hloupé řešení naznačuje správné řešení. Chceme mít neomezené počet produktů spojených s nákupem. Jediný způsob je mít prostřední spojovací stůl . Říkejme tomu purchase_item . purchase_item tabulka je spojena s purchase a product . Nyní může nákup zahrnovat tolik produktů, kolik chceme. Jako bonus můžeme do tabulky přidat další údaje:počet nákupů, celkovou cenu za toto zboží atd.


Závěry:

  • Tabulky v modelu mohou představovat nejen fyzické objekty jako zákazník nebo produkt. Tabulky mohou představovat více abstraktních pojmů jako nákup. Dalšími příklady mohou být rezervace v hotelovém rezervačním systému, půjčení knihy v modelu pro knihovnu, schůzka v systému pro lékaře atd.
  • Když modelujete transakci (tj. nákup nebo prodej mnoha věcí), obvykle potřebujete tři tabulky :jeden pro transakci (nákup nebo rezervace v hotelovém rezervačním systému), jeden pro věci zakoupené/prodané v rámci transakce (produkt, hotelový pokoj) a jeden pro transakční položky (položka nákupu, položka rezervace). V případě potřeby můžete do přechodné tabulky přidat další informace.

Vytvořte si svůj vlastní model databáze obchodu pomocí Vertabelo!


  1. Metoda sběru:Funkce LIMIT v databázi Oracle

  2. Před spuštěním skriptů Delete/Load data uzamkněte databázi Oracle

  3. Operátor zřetězení řetězců v Oracle, Postgres a SQL Server

  4. MySQL vybírá souřadnice v dosahu