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;