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

Cizí klíč pro více tabulek a sloupců?

Název položky nemusíte uvádět v obou tabulkách. Tomu se říká denormalizované řešení. Měli byste to mít pouze v tabulce položek a odkazovat pouze na id, pak pokud potřebujete také jméno, můžete se k němu připojit na základě primárního klíče (id). Jinak je v mém názor.

CREATE TABLE user(
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(20) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE items(
  i_id INT(11) NOT NULL AUTO_INCREMENT,
  name TINYTEXT NOT NULL,
  price DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (i_id)
);

CREATE TABLE user_purchase(
  i_id INT(11) NOT NULL,
  name TINYTEXT NOT NULL,
  id INT(11) NOT NULL,
  FOREIGN KEY (i_id) REFERENCES items(i_id),
  FOREIGN KEY (id) REFERENCES user(id)
);

Někdy, když je výkon kritický, musíte použít denormalizované tabulky. Může to být mnohem rychlejší.

Normalizace je důležitá, abyste se vyhnuli různým anomáliím. Pokud máte tabulky v normální formě na vysoké úrovni, vaše tabulky nebudou nadbytečné a nebudou mít tyto anomálie. Pokud máte například něco uložené na více místech, musíte se o to starat, abyste udrželi všechna nadbytečná data aktuální. To vám dává šanci, že to uděláte nesprávně a skončíte s různými anomáliemi.

Ve vaší situaci vám cizí klíč pomůže zachovat integritu dat, ale bez cizího klíče pro název byste mohli mít položky s názvy v nákupech, které nejsou uvedeny v tabulce položek.

Toto je druh anomálie.

Je mnoho druhů, nejlepší je se jim vyhýbat, dokud můžete.

Další informace o anomáliích

V některých případech musíte denoramalizovat. Některá data tedy ukládejte redundantně kvůli problémům s výkonem. Tímto způsobem můžete ušetřit některé operace spojení, které by mohly zabrat mnoho času.

Podrobnosti normalizace jsou pokryty tématy různých normálních forem:NF0, NF1, NF2, NF3 a BCNF

Normální formy podrobně

Další podrobnosti o matematických základech bezeztrátového rozkladu na vyšší normální formy viz "Funkční závislosti". To vám pomůže pochopit, proč můžete ponechat ID „nadbytečná“. Prakticky jsou nezbytnou redundancí, protože je potřebujete, abyste mohli později znovu sestavit původní datovou sadu. Toto bude definice pro různé normální formy. Jaká úroveň této redundance je povolena?

Funkční závislosti



  1. Oracle SQL:Aktualizujte tabulku daty z jiné tabulky

  2. Import JSON do Mysql

  3. Odečtěte minuty od časové hodnoty v PostgreSQL

  4. Proč MySQL COUNT bez názvu tabulky dává 1