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

SQL vztah mnoho k mnoha mezi více tabulkami

Ano, vše tam vypadá v pořádku. Ale...

Několik poznámek:

Pro gender bychom použili kratší datový typ sloupec; Nevidím, že bychom k tomu potřebovali 255 znaků. (Existuje omezení maximální velikosti řádku, které je vynuceno.) Pokud pro to existuje pouze několik hodnot, budeme uvažovat ENUM datový typ.

Pravděpodobně bychom také přidali NOT NULL omezení na několik těchto sloupců, jako je jméno hrdiny, jméno, příjmení. Pravděpodobně bychom také přidali DEFAULT '' . Někdy z nějakého důvodu opravdu potřebujeme povolit hodnoty NULL, ale používáme NOT NULL kdekoli můžeme.

Váhám nad TEXT sloupců. Na použití TEXT není nic špatného datový typ, ale mám jen podezření, že tyto mohou „skrývat“ nějaké informace, které by bylo lepší uložit do dalších sloupců.

U cizích klíčů bychom omezením přiřadili název podle vzoru, který používáme, a pravděpodobně také přidali ON UPDATE CASCADE ON DELETE CASCADE

CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID) 
  REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE

Poznámka k identifikátorům (názvy tabulek a názvy sloupců)

Jak to děláme, všechny názvy tabulek jsou malá písmena . (Máme sadu voleb MySQL, která nutí všechny názvy tabulek na malá písmena.) Děláme to proto, abychom se vyhnuli problémům s nekompatibilitou pro různé operační systémy/systémy souborů (některé rozlišují malá a velká písmena a některé ne).

Také názvy tabulek jsou singulární . Název tabulky pojmenovává jeden řádek tabulky představuje. Nezahrnujeme ani _table jako součást názvu.

Názvy sloupců v MySQL nikdy nerozlišují malá a velká písmena, ale vždy používáme malá písmena i pro názvy sloupců. Názvy sloupců „nevelbloudíme“, ale jako oddělovače používáme znak podtržítka, např. power_id vs. powerID , hero_name vs. heroName .

NÁSLEDOVAT

Mé „poznámky“ výše nejsou konkrétními pravidly, která je třeba dodržovat; to jsou jen vzory, které používáme.

Dodržování těchto vzorů nezaručuje, že budeme mít úspěšný software, ale pomáhá nám to.

Pro vaši informaci ukážu, jak by tyto stoly vypadaly jako "první řez" z našeho obchodu, jako ilustraci jiného vzoru; toto není „správná cesta“, je to jen „cesta“, na které jsme se jako tým usadili.

CREATE TABLE superhero
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, hero_name        VARCHAR(255) NOT NULL                COMMENT ''
, first_name       VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, last_name        VARCHAR(255) NOT NULL DEFAULT ''     COMMENT ''
, first_appearance DATE                                 COMMENT 'date superhero first appeared'
, gender           ENUM('female','male','other')        COMMENT 'female,male or other'
, biography_text   TEXT                                 COMMENT ''
, universe         VARCHAR(255)                         COMMENT ''
, PRIMARY KEY(id)
, UNIQUE KEY superhero_UX1 (hero_name) 
) ENGINE=InnoDB;

CREATE TABLE power
( id               INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, name             VARCHAR(255) NOT NULL                COMMENT ''  
, description_text TEXT NOT NULL                        COMMENT '' 
, PRIMARY KEY(id)
, UNIQUE KEY power_UX1 (name)
) ENGINE=InnoDB;

CREATE TABLE superheropower
( superhero_id   INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref superhero'
, power_id       INT UNSIGNED NOT NULL         COMMENT 'pk, fk ref power'
, PRIMARY KEY(superhero_id, power_id)
, CONSTRAINT FK_superheropower_superhero 
     FOREIGN KEY(superhero_id) REFERENCES superhero(id)
     ON UPDATE CASCADE ON DELETE CASCADE
, CONSTRAINT FK_superheropower_power
     FOREIGN KEY (power_id) REFERENCES power(id) 
     ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;


  1. Rozdělit řetězce pomocí mysql

  2. Jak připojit aplikaci pro Android k databázi MySQL?

  3. Co je ekvivalent LEN() v MySQL?

  4. PYTHON:Aktualizujte MULTIPLE SLOUPCE pomocí proměnných pythonu