Du behøver ikke at inkludere varenavn i begge tabeller. Dette kaldes en denormaliseret løsning. Du skal kun have det i emnetabellen og kun henvise til id'et, så hvis du også har brug for navnet, kan du tilslutte det baseret på den primære nøgle(id). Ellers er det helt OK i min udtalelse.
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)
);
Nogle gange, når ydeevnen er kritisk, skal du bruge denormaliserede tabeller. Det kan være meget hurtigere.
Normalisering er vigtig for at undgå forskellige anomalier. Hvis du har tabeller i en normal form på højt niveau, vil dine tabeller ikke være overflødige og vil ikke have disse anomalier. For eksempel hvis du har noget gemt flere steder, skal du passe på for at holde alle de overflødige data opdateret. Dette giver dig en chance for at gøre dette forkert og ende med at have forskellige anomalier.
I din situation hjælper det dig med at have en fremmednøgle med at bevare dataintegriteten, men uden en fremmednøgle til navnet ville du være i stand til at have varer med navne i indkøbene, som ikke er til stede i varetabellen.
Dette er en slags anomali.
Der er mange slags dette, bedst at undgå dem, så længe du kan.
I nogle tilfælde skal du denoramalisere. Så gem nogle data redundant på grund af ydeevneproblemer. På denne måde kan du spare nogle join-operationer, der kan tage meget tid.
Detaljer om normalisering er dækket af emner af forskellige normale former:NF0, NF1, NF2, NF3 og BCNF
For yderligere detaljer om det matematiske grundlag for tabsfri nedbrydning til højere normale former se "Funktionelle afhængigheder". Dette vil hjælpe dig med at forstå, hvorfor du kan holde id'erne "overflødige". Stort set er de nødvendig redundans, da du har brug for dem for senere at kunne genopbygge det originale datasæt. Dette vil være definitionen for de forskellige normale former. Hvilket niveau af denne redundans er tilladt?