Untuk apa pun yang selalu ditetapkan untuk setiap pengguna Anda harus cenderung menyimpannya di Users
tabel, per normalisasi biasa. Adapun konfigurasi opsional saya cenderung menyukai struktur tabel berikut:
TABLE Users:
id INT AI
name VARCHAR
...
TABLE User_Settings
user_id INT PK,FK
name VARCHAR PK
type BOOL
value_int INT NULL
value_str VARCHAR NULL
Dimana User_Settings.type
menentukan apakah bidang integer atau string harus dirujuk.
yaitu:
INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');
Dan untuk masalah INSERT/UPDATE:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
ON DUPLICATE KEY UPDATE value_str='fr';
Selain itu, seperti yang dikatakan kebanyakan orang, membuat serial dan menyimpan preferensi bukanlah ide yang bagus karena:
- Anda tidak dapat mengambil satu nilai pun dengan kueri, Anda harus mengambil seluruh string bersambung, membatalkan serialisasi, dan membuang data yang tidak perlu.
- Ini mudah rusak, dan sulit untuk dipulihkan.
- Menulis permintaan mentah yang sulit, misalnya:untuk memperbaiki setelan tertentu secara global.
- Anda menyimpan apa yang pada dasarnya adalah data tabular dalam satu bidang tabel.
Edit Retrospektif September 2016:
Selama waktu itu, saya memiliki beberapa argumen dengan orang-orang tentang cara terbaik untuk menyimpan pengaturan opsional, serta struktur tabel umum yang ditentukan di atas.
Meskipun struktur tabel itu tidak terlalu buruk , itu tidak benar-benar baik antara. Ini mencoba untuk membuat yang terbaik dari situasi yang buruk. Serialisasi pengaturan opsional dapat bekerja selama Anda dapat mengakomodasi pengaturan ini:
- Semua dimuat sekaligus, tanpa memilih atau memilih.
- Tidak dapat diindeks, dapat ditelusuri, atau dimodifikasi dengan mudah secara massal .
Kemudian Anda dapat mempertimbangkan untuk menambahkan bidang seperti optional_settings
di Users
tabel yang berisi bentuk pengaturan [misalnya:JSON] berseri. Anda melakukan trade off di atas, tetapi ini adalah pendekatan yang lebih mudah dan Anda dapat menyimpan pengaturan yang lebih kompleks.
Juga, jika Anda menggunakan tipe LOB seperti TEXT
untuk penyimpanan data tidak harus disimpan "dalam baris" setidaknya di MySQL.
Bagaimanapun, terserah Anda untuk menentukan persyaratan dan batasan aplikasi Anda, dan membuat pilihan terbaik berdasarkan informasi tersebut.