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

Jak navrhnout filmovou databázi?

Musíte rozlišovat mezi atributy a entitami. Entita je věc – obvykle podstatné jméno. Atribut je spíše popisem informace. V databázovém žargonu entita =tabulka, atribut =pole/sloupec.

Mít samostatnou tabulku pro určité věci, použijme jako příklad ředitel, se nazývá normalizace. I když to může být za určitých okolností dobré, za jiných to může být zbytečné (protože obecně to dělá dotazy složitějšími - musíte vše spojit - a je to pomalejší).

V tomto případě není nutné mít tabulku roku, protože kromě roku samotného neexistují žádné další atributy, které byste ukládali. Je lepší to denormalizovat a rok uložit do samotné filmové tabulky.

Na druhou stranu ředitel je jiný. Možná budete chtít uložit režisérovo křestní jméno, příjmení, datum narození, datum úmrtí (pokud existuje) atd. Samozřejmě nechcete zadávat datum narození režiséra pokaždé, když zadáte film, který tato osoba řídí, takže má smysl mít pro ředitele samostatnou entitu.

I když jste nechtěli ukládat všechny tyto informace o řediteli (chcete jen jeho jméno), mít pro to samostatnou tabulku (a použít náhradní klíč - k tomu se dostanu za vteřinu) je užitečné, protože zabraňuje typografickým chybám a duplicitám – pokud máte něčí jméno napsané špatně nebo zadané jinak (první, poslední vs. poslední, první), pak pokud se pokusíte najít další filmy, které režíroval, neuspějete.

Použití náhradního klíče (primárního klíče) pro tabulky je obecně dobrý nápad. Shoda celého čísla je mnohem rychlejší než shoda řetězce. Umožňuje vám také libovolně měnit název, aniž byste se museli starat o cizí klíče uložené v jiných tabulkách (ID zůstává stejné, takže nemusíte nic dělat).

Tento design můžete dotáhnout opravdu docela daleko a je to jen otázka toho, co všechno do něj chcete uložit.

Například namísto jednoho režiséra na film mají některé filmy více režisérů... takže mezi filmy a režiséry bude vztah mnoho k mnoha, takže byste potřebovali tabulku s např.:

films_directors => **filmid, directorid**

Když to vezmeme o krok dále, někdy jsou režiséři také herci a naopak. Takže spíše než mít tabulky režisérů a herců byste mohli mít stůl pro jednu osobu a připojit se k tomuto stolu pomocí tabulky rolí. Stůl rolí by zastával různé pozice - např. režisér, producent, hvězda, komparz, grip, střihač... a vypadal by spíš takto:

films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**

Můžete mít také pole podrobnosti o roli v tabulce film_people, které může obsahovat další informace v závislosti na roli (např. název role, kterou herec hraje).

Také ukazuji žánr jako mnoho<>mnoho vztahu, protože film je možný ve více žánrech. Pokud byste to nechtěli, pak by filmy místo tabulky film_genre obsahovaly jen žánrovku.

Jakmile je toto nastaveno, je snadné se dotázat a najít vše, co daný člověk udělal, nebo vše, co člověk udělal jako režisér, nebo kdokoli, kdo kdy režíroval film, nebo všechny osoby zapojené do jednoho konkrétního filmu. Může to pokračovat dál a dál.



  1. jednoduché uvozovky v SQL Query

  2. Co přesně znamená znaková sada a řazení?

  3. oracle -- Rozdělte více hodnot oddělených čárkou v tabulce Oracle na více řádků

  4. Spuštění PostgreSQL pomocí Amazon RDS