sql >> Databasteknik >  >> RDS >> Mysql

Utländsk nyckel för flera tabeller och kolumner?

Du behöver inte inkludera objektnamn i båda tabellerna. Detta kallas en denormaliserad lösning. Du bör bara ha det i objekttabellen och endast hänvisa till id, sedan om du behöver namnet också kan du gå med i det baserat på primärnyckeln(id). Annars är det helt OK i min åsikt.

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)
);

Ibland när prestanda är kritisk måste du använda denormaliserade tabeller. Det kan vara mycket snabbare.

Normalisering är viktigt för att undvika olika anomalier. Om du har tabeller i en normal form på hög nivå kommer dina tabeller inte att vara överflödiga och kommer inte att ha dessa anomalier. Om du till exempel har något lagrat på flera platser måste du ta hand om för att hålla all redundant data uppdaterad. Detta ger dig en chans att göra detta felaktigt och i slutändan få olika anomalier.

I din situation hjälper en främmande nyckel dig att behålla dataintegriteten, men utan en främmande nyckel för namnet skulle du kunna ha föremål med namn i inköpen som inte finns i artikeltabellen.

Detta är en sorts anomali.

Det finns många typer av detta, bäst att undvika dem så länge du kan.

Läs mer här om anomalier

I vissa fall måste du denoramalisera. Så lagra en del data redundant på grund av prestandaproblem. På så sätt kan du spara några anslutningsoperationer som kan ta mycket tid.

Detaljer om normalisering täcks av ämnen av olika normala former:NF0, NF1, NF2, NF3 och BCNF

Normala former i detalj

För ytterligare detaljer om de matematiska grunderna för förlustfri nedbrytning till högre normala former, se "Funktionella beroenden". Detta kommer att hjälpa dig att förstå varför du kan hålla ID:n "överflödiga". Praktiskt taget är de nödvändig redundans, eftersom du behöver dem för att senare kunna bygga om den ursprungliga datamängden. Detta kommer att vara definitionen för de olika normalformerna. Vilken nivå av denna redundans är tillåten?

Funktionella beroenden



  1. Visar alla tabellnamn i php från MySQL-databasen

  2. Entity Framework C# Infoga data ryska kodningsproblem

  3. Mysql-frågan använder inte index när det finns variabler i WHERE

  4. Returnera ID på INSERT?