Jawaban lain dengan cakap menguraikan pro dan kontra dari berbagai opsi Anda.
Saya percaya bahwa Opsi 1 (tas properti) Anda adalah desain keseluruhan terbaik untuk sebagian besar aplikasi, terutama jika Anda membangun beberapa perlindungan terhadap kelemahan tas properti.
Lihat ERD berikut:
Di ERD di atas, USER_SETTING
tabel sangat mirip dengan OP. Perbedaannya adalah alih-alih varchar Code
dan Value
kolom, desain ini memiliki FK ke SETTING
tabel yang mendefinisikan pengaturan yang diizinkan (Kode) dan dua kolom yang saling eksklusif untuk nilai tersebut. Salah satu opsi adalah bidang varchar yang dapat mengambil jenis input pengguna apa pun, yang lainnya adalah FK ke tabel nilai hukum.
SETTING
tabel juga memiliki tanda yang menunjukkan apakah pengaturan pengguna harus ditentukan oleh FK atau oleh input varchar yang tidak dibatasi. Anda juga dapat menambahkan data_type
ke SETTING
untuk memberi tahu sistem cara menyandikan dan menafsirkan USER_SETTING.unconstrained_value
. Jika mau, Anda juga dapat menambahkan SETTING_GROUP
tabel untuk membantu mengatur berbagai pengaturan untuk pemeliharaan pengguna.
Desain ini memungkinkan Anda untuk mengatur aturan di sekitar pengaturan Anda. Ini nyaman, fleksibel, dan mudah dirawat, sekaligus menghindari penggunaan gratis untuk semua.
EDIT: Beberapa detail lainnya, termasuk beberapa contoh...
Perhatikan bahwa ERD, di atas, telah ditambah dengan lebih banyak detail kolom (nilai rentang pada SETTING dan kolom pada ALLOWED_SETTING_VALUE).
Berikut adalah beberapa contoh catatan untuk ilustrasi.
SETTING:
+----+------------------+-------------+--------------+-----------+-----------+
| id | description | constrained | data_type | min_value | max_value |
+----+------------------+-------------+--------------+-----------+-----------+
| 10 | Favourite Colour | true | alphanumeric | {null} | {null} |
| 11 | Item Max Limit | false | integer | 0 | 9001 |
| 12 | Item Min Limit | false | integer | 0 | 9000 |
+----+------------------+-------------+--------------+-----------+-----------+
ALLOWED_SETTING_VALUE:
+-----+------------+--------------+-----------+
| id | setting_id | item_value | caption |
+-----+------------+--------------+-----------+
| 123 | 10 | #0000FF | Blue |
| 124 | 10 | #FFFF00 | Yellow |
| 125 | 10 | #FF00FF | Pink |
+-----+------------+--------------+-----------+
USER_SETTING:
+------+---------+------------+--------------------------+---------------------+
| id | user_id | setting_id | allowed_setting_value_id | unconstrained_value |
+------+---------+------------+--------------------------+---------------------+
| 5678 | 234 | 10 | 124 | {null} |
| 7890 | 234 | 11 | {null} | 100 |
| 8901 | 234 | 12 | {null} | 1 |
+------+---------+------------+--------------------------+---------------------+
Dari tabel-tabel tersebut, kita dapat melihat bahwa beberapa pengaturan pengguna yang dapat ditentukan adalah Warna Favorit, Batas Maks Barang, dan Batas Minimum Barang. Warna Favorit adalah daftar pilihan alfanumerik. Batas minimum dan maksimum item adalah numerik dengan nilai rentang yang diizinkan ditetapkan. SETTING.constrained
kolom menentukan apakah pengguna memilih dari ALLOWED_SETTING_VALUE
terkait s atau apakah mereka perlu memasukkan USER_SETTING.unconstrained_value
. GUI yang memungkinkan pengguna untuk bekerja dengan pengaturan mereka perlu memahami opsi mana yang ditawarkan dan bagaimana menerapkan keduanya SETTING.data_type
dan min_value
dan max_value
batas, jika ada.
Dengan menggunakan desain ini, Anda dapat mengatur pengaturan yang diizinkan termasuk metadata yang cukup untuk menerapkan beberapa batasan dasar/pemeriksaan kewarasan pada nilai yang dipilih (atau dimasukkan) oleh pengguna.
EDIT:Contoh Kueri
Berikut ini beberapa contoh SQL yang menggunakan data di atas untuk mencantumkan nilai setelan untuk ID pengguna yang diberikan:
-- DDL and sample data population...
CREATE TABLE SETTING
(`id` int, `description` varchar(16)
, `constrained` varchar(5), `data_type` varchar(12)
, `min_value` varchar(6) NULL , `max_value` varchar(6) NULL)
;
INSERT INTO SETTING
(`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`)
VALUES
(10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL),
(11, 'Item Max Limit', 'false', 'integer', '0', '9001'),
(12, 'Item Min Limit', 'false', 'integer', '0', '9000')
;
CREATE TABLE ALLOWED_SETTING_VALUE
(`id` int, `setting_id` int, `item_value` varchar(7)
, `caption` varchar(6))
;
INSERT INTO ALLOWED_SETTING_VALUE
(`id`, `setting_id`, `item_value`, `caption`)
VALUES
(123, 10, '#0000FF', 'Blue'),
(124, 10, '#FFFF00', 'Yellow'),
(125, 10, '#FF00FF', 'Pink')
;
CREATE TABLE USER_SETTING
(`id` int, `user_id` int, `setting_id` int
, `allowed_setting_value_id` varchar(6) NULL
, `unconstrained_value` varchar(6) NULL)
;
INSERT INTO USER_SETTING
(`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`)
VALUES
(5678, 234, 10, '124', NULL),
(7890, 234, 11, NULL, '100'),
(8901, 234, 12, NULL, '1')
;
Dan sekarang DML untuk mengekstrak pengaturan pengguna:
-- Show settings for a given user
select
US.user_id
, S1.description
, S1.data_type
, case when S1.constrained = 'true'
then AV.item_value
else US.unconstrained_value
end value
, AV.caption
from USER_SETTING US
inner join SETTING S1
on US.setting_id = S1.id
left outer join ALLOWED_SETTING_VALUE AV
on US.allowed_setting_value_id = AV.id
where US.user_id = 234
Lihat ini di SQL Fiddle.