sql >> Databáze >  >> RDS >> Oracle

návrh databáze one-to-many-to-many

Vždy byste měli začít navrhováním svých tabulek ve třetí normální formě (3NF). Je docela přijatelné vrátit se k menším formám (obvykle z důvodů výkonu), pokud rozumíte a zmírníte dopad, ale začněte s 3NF.

(Poněkud zjednodušené) pravidlo, které je třeba si zapamatovat, je, že každý neklíčový sloupec v tabulce by měl záviset na:

  • klíč,
  • celý klíč,
  • a nic než klíč,
  • "tak mi pomoz, Codde" - trocha humoru DBA (a myslím "málo").

První otázka je poměrně jednoduchá.

Vztahy one-to-many jsou nejlépe reprezentovány jako cizí klíč v tabulce "many". Takže to, co navrhuješ, je rozumné. Umožňuje automaticky omezit vztah. Pokud byste měli samostatnou spojovací tabulku (používá se pro many-to-many), museli byste se uchýlit k „podvodu“, abyste prosadili vztah one-to-many.

Pokud jde o vaši druhou otázku, musíte se podívat na výše uvedené pravidlo „Codd“ a zamyslet se nad sebou:co přesně tyto řádky v každé tabulce představují? Pokud je akce pracovní položky odlišným objektem od pracovní položky (mohou spolu souviset ale pokud nepředstavují stejný objekt, jsou odlišné), měly by být v různých tabulkách.

Navíc se zdá, že tam máte vztah jedna k mnoha (jedna položka může mít mnoho akcí), takže by měly být v různých tabulkách už jen z tohoto důvodu.

Pokud jde o váš dotaz na nadbytečné informace:pokud skutečně jsou nadbytečné, měly by být opraveny.

Pomocí step_num jako příklad, co přesně to představuje? Pokud se jedná o atribut pracovní položky, nemělo by to být v pracovní akci tabulky vůbec.

Odtud byste se ho zbavili a pokud byste chtěli znát číslo kroku pro řádek v tabulce pracovních akcí, spojili byste se s tabulkou pracovních položek pomocí cizího klíče.

Pokud je to místo toho atribut pracovní akce, měli byste jej odstranit z tabulky pracovních položek, protože to nedává smysl. Můžete mít dvě akce, každou s jiným číslem kroku, takže jaké by bylo v tomto případě číslo kroku nadřazené položky?

Samozřejmě můžete mít výrazné číslo kroku pro obě položky a akce – v tom případě bych zvážil přejmenování, aby byl záměr jasný, něco jako item_step_num a action_step_num .

Sečteno a podtrženo je začít s 3NF. Pokud v určitém okamžiku vaše databáze běží příliš pomalu, pak zvážit návrat k menší formě. Poté se můžete zeptat dalšího zde si položte otázku, jak rozpoznat a zmírnit problémy, které z toho vyplývají (například možnost nekonzistentních dat na dvou místech a použití spouštěčů, které tomu mají zabránit).




  1. Funkce MySQL pro výpočet vzdálenosti mezi dvěma zeměpisnými šířkami a délkami

  2. Count s LEFT JOIN zobrazuje pouze jeden řádek

  3. MySQL - Vybrat vše kromě toho, co je v této tabulce

  4. Django MySQL fulltextové vyhledávání