Anda tidak harus menyertakan nama item di kedua tabel. Ini disebut solusi denormalisasi. Anda harus memilikinya hanya di tabel item dan hanya merujuk ke id, kemudian jika Anda membutuhkan nama juga, Anda dapat menggabungkannya berdasarkan kunci utama (id). Jika tidak, itu benar-benar OK di saya pendapat.
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)
);
Terkadang ketika kinerja sangat penting, Anda harus menggunakan tabel yang didenormalisasi. Ini bisa jauh lebih cepat.
Normalisasi penting untuk menghindari anomali yang berbeda. Jika Anda memiliki tabel dalam bentuk normal tingkat tinggi maka tabel Anda tidak akan berlebihan dan tidak akan memiliki anomali ini. Misalnya, jika Anda memiliki sesuatu yang disimpan di beberapa lokasi, Anda harus menjaga agar semua data yang berlebihan tetap mutakhir. Ini memberi Anda kesempatan untuk melakukan kesalahan ini dan berakhir dengan anomali yang berbeda.
Dalam situasi Anda memiliki kunci asing membantu Anda untuk menjaga integritas data tetapi tanpa kunci asing untuk nama Anda akan dapat memiliki item dengan nama dalam pembelian yang tidak ada di tabel item.
Ini semacam anomali.
Ada banyak jenisnya, sebaiknya hindari sebisa mungkin.
Baca selengkapnya di sini tentang anomali
Dalam beberapa kasus Anda harus melakukan denoramaalisasi. Jadi simpan beberapa data secara berlebihan karena masalah kinerja. Dengan cara ini Anda dapat menghemat beberapa operasi gabungan yang dapat menghabiskan banyak waktu.
Detail normalisasi dicakup oleh topik bentuk normal yang berbeda:NF0, NF1, NF2, NF3 dan BCNF
Untuk detail lebih lanjut tentang dasar matematika dari dekomposisi tanpa kehilangan ke bentuk normal yang lebih tinggi, lihat "Ketergantungan fungsional". Ini akan membantu Anda memahami mengapa Anda dapat menyimpan id "berlebihan". Sebenarnya mereka adalah redundansi yang diperlukan, karena Anda membutuhkannya agar nantinya dapat membangun kembali kumpulan data asli. Ini akan menjadi definisi untuk bentuk normal yang berbeda. Berapa tingkat redundansi ini yang diperbolehkan?