Anda tidak ingin menyimpan nilai dalam bentuk yang dipisahkan koma.
Pertimbangkan kasus ketika Anda memutuskan untuk menggabungkan kolom ini dengan tabel lain.
Anggap saja Anda sudah,
x items
1 1, 2, 3
1 1, 4
2 1
dan Anda ingin menemukan nilai yang berbeda untuk setiap x yaitu:
x items
1 1, 2, 3, 4
2 1
atau mungkin ingin memeriksa apakah ada 3 di dalamnya
atau mungkin ingin mengubahnya menjadi baris terpisah:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Ini akan menjadi SAKIT BESAR.
Gunakan minimal normalisasi prinsip 1 - memiliki baris terpisah untuk setiap nilai.
Sekarang, katakan awalnya Anda memiliki ini sebagai meja Anda:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Anda dapat dengan mudah mengubahnya menjadi nilai csv:
select x, group_concat(item order by item) items
from t
group by x
Jika Anda ingin mencari apakah x =1 memiliki item 3. Mudah.
select * from t where x = 1 and item = 3
yang dalam kasus sebelumnya akan menggunakan mengerikan find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Jika menurut Anda Anda dapat menggunakan suka dengan nilai CSV untuk menelusuri, maka like %x%
terlebih dahulu tidak dapat menggunakan indeks. Kedua, itu akan menghasilkan hasil yang salah.
Katakan Anda ingin memeriksa apakah item ab ada dan Anda melakukan %ab%
itu akan mengembalikan baris dengan abc abcd abcde .... .
Jika Anda memiliki banyak pengguna dan item, maka saya sarankan membuat tabel terpisah users
dengan userid PK, items
lainnya dengan PK itemid dan terakhir tabel pemetaan user_item
memiliki kolom userid, itemid.
Jika Anda tahu Anda hanya perlu menyimpan dan mengambil nilai-nilai ini dan tidak melakukan operasi apa pun padanya seperti bergabung, mencari, membedakan, konversi ke baris terpisah, dll. - mungkin saja, Anda bisa (saya masih akan 't).