it-swarm-eu.dev

Zda vytvořit samostatné tabulky pro různé typy produktů?

Jsem v procesu navrhování databáze a mám druhé myšlenky ohledně mých původních návrhových rozhodnutí ...

Typy produktů jsou následující ... Modely, díly, sady náhradních dílů a možnosti.

Varianta A (první návrh): Plánoval jsem mít samostatné tabulky pro výše uvedené typy produktů. Řekl bych, že asi 75% polí bude v každé tabulce stejné.

Každý typ produktu jsem vytvořil jako samostatné tabulky kvůli asociacím, které musím mezi nimi vytvořit. Například model může mít mnoho možností a volba může mít mnoho modelů. Možnost může mít také mnoho částí a část může mít mnoho možností ... atd. ...

Možnost B: Namísto samostatných tabulek bych mohl vytvořit tabulku nazvanou Produkt, která zahrnuje model, součást, soupravu náhradních dílů a možnosti. Mohl bych mít jedno pole s názvem typ pro rozlišení mezi modelem, možnostmi atd. Předpokládám, že spodní strana je několik polí, která by nikdy nebyla použita (u některých typů produktů ponechána nulová). Myslím, že to je místo, kde by do hry vstoupily „ne osvědčené postupy“.

Možnost B by výrazně snížila složitost návrhu db. Také bych se nemusel starat o odkazování na spoustu tabulek při vytahování dat pro dotazy ...

25
payling

Pokud by to bylo moje návrhové rozhodnutí, pravděpodobně bych šel s více „možností C“ (upravená možnost a).

Zaprvé, proč ne „možnost B“:

Pro jednu věc se mi líbí jasnost, že každý produkt má svůj vlastní stůl poskytuje. Pokud je to všechno jedna velká tabulka s polem pro určení typu, vztah není tak jasný.

Pro jinou by strategie indexování vždy vyžadovala, aby byl uveden typ pole. Protože se jedná pouze o 4 typy, je indexová mohutnost extrémně nízká (SELECT * FROM product_table WHERE type='X' v podstatě provádí skenování celé tabulky)

Varianta C

  • Vytvořte nadřazenou tabulku, která obsahuje pouze sloupce, které všechny typy sdílejí
  • Vytvořte každý typ produktu jako vlastní tabulku s jejich samostatnými sloupci, s jedním navíc: Odkaz na nadřazenou tabulku
  • Vytvořte každou tabulku „link“: Product_Option, Model_option atd. S odkazy na příslušné klíče.
  • Pro ty, kteří mají vzájemné vazby (MODEL_OPTION, OPTION_MODEL), pokračujte a vytvořte tyto tabulky. To vám přidá jasnost ve vašich spojeních pro kohokoli, kdo se na to dívá.

Nevýhodou je složitost zajistit, aby se zabránilo sirotkům, když se věci aktualizují/odstraní, a nejprve navrhnout dotazy, které tyto tabulky používají.

8
Derek Downey

Navrhuji, abyste začali s „správným“ relačním modelem, vaší možností A. Pokud vám typické použití tohoto modelu povede v některých oblastech k denormalizaci, nebojte se tak učinit.

Minulý týden jsem diskutoval s kolegou o tom, jak jsou návrhy schémat často považovány za něco, co je zasazeno do kamene a nemůže se nikdy změnit. Je zvláštní, že vzhledem k tomu, jak je refactoring v přijatelné praxi ve všech ostatních vrstvách aplikace, je refactoring databázového schématu stále považován za nepraktický.

Pokud je rozhraní k databázi dobře navrženo, nic vám nebrání v přizpůsobování schématu, protože se dozvíte více o vzorcích využití systémů.

7

To zní velmi podobně jako účty materiálů/více kardinálií dědictví, které popisuje Paul Neilsen v kapitola 17 z The SQL Server 2008 Bible .

Celá kapitola je velmi dobře přečtená a konkrétní část, která řeší váš problém s mnoha problémy, je uvedena na stránkách 416-419.

Toto je nejlepší diskuse, kterou jsem kdy viděl ohledně explodovaných částí typu návrhu dat.

Pokud dokážete zobrazovat pravděpodobný scénář, ve kterém by byly časté dotazy, které by se týkaly všech čtyř typů produktů (a které se mi zdají pravděpodobně), pak je nejlepší volba B.

Proč namísto ponechání mnoha nevyužitelných polí s nulovatelnými hodnotami v tabulce Product, proč přidat tabulku ModelProduct, tabulku PartProduct, tabulku ReplacementPartKitProduct a mít v těchto tabulkách pouze pole, která jsou pro tyto typy odlišná? V těchto tabulkách použijte stejný primární klíč jako tabulka produktů. Připojte se k tabulce Product and ModelProduct, chcete-li pracovat s modely. Potřebujete zjistit, zda je záznam o produktu součástí? Jednoduše se připojte vlevo od produktu k PartProduct, a pokud PartProduct. [PrimaryKey] není null, máte Part. Pokud je nulová, není součástí. Alternativně můžete do tabulky Produkt přidat pole ProductType.

0
Alan McBee