अन्य उत्तरों ने आपके विभिन्न विकल्पों के पेशेवरों और विपक्षों को अच्छी तरह से रेखांकित किया है।
मेरा मानना है कि आपका विकल्प 1 (संपत्ति बैग) अधिकांश अनुप्रयोगों के लिए सबसे अच्छा समग्र डिज़ाइन है, खासकर यदि आप संपत्ति बैग की कमजोरियों के खिलाफ कुछ सुरक्षा में निर्माण करते हैं।
निम्नलिखित ईआरडी देखें:
उपरोक्त ईआरडी में, USER_SETTING
तालिका ओपी के समान ही है। अंतर यह है कि varchar के बजाय Code
और Value
कॉलम, इस डिज़ाइन में FK से लेकर SETTING
. है तालिका जो स्वीकार्य सेटिंग्स (कोड) और मूल्य के लिए दो परस्पर अनन्य कॉलम को परिभाषित करती है। एक विकल्प एक वर्चर फ़ील्ड है जो किसी भी प्रकार का उपयोगकर्ता इनपुट ले सकता है, दूसरा कानूनी मूल्यों की तालिका के लिए एक FK है।
SETTING
तालिका में एक ध्वज भी होता है जो इंगित करता है कि उपयोगकर्ता सेटिंग्स को एफके या अप्रतिबंधित वर्चर इनपुट द्वारा परिभाषित किया जाना चाहिए या नहीं। आप एक data_type
भी जोड़ सकते हैं SETTING
. पर सिस्टम को यह बताने के लिए कि USER_SETTING.unconstrained_value
को एन्कोड और व्याख्या कैसे करें . यदि आप चाहें, तो आप SETTING_GROUP
. भी जोड़ सकते हैं उपयोगकर्ता-रखरखाव के लिए विभिन्न सेटिंग्स को व्यवस्थित करने में मदद करने के लिए तालिका।
यह डिज़ाइन आपको अपनी सेटिंग्स के आसपास के नियमों को टेबल-ड्राइव करने की अनुमति देता है। यह सुविधाजनक, लचीला और बनाए रखने में आसान है, जबकि सभी के लिए निःशुल्क होने से बचा जाता है।
संपादित करें: कुछ उदाहरणों सहित कुछ और विवरण...
ध्यान दें कि ऊपर दिए गए ईआरडी को अधिक कॉलम विवरण (SETTING पर श्रेणी मान और ALLOWED_SETTING_VALUE पर कॉलम) के साथ संवर्धित किया गया है।
उदाहरण के लिए यहां कुछ नमूना रिकॉर्ड दिए गए हैं।
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 |
+------+---------+------------+--------------------------+---------------------+
इन तालिकाओं से, हम देख सकते हैं कि कुछ उपयोगकर्ता सेटिंग्स जो निर्धारित की जा सकती हैं, पसंदीदा रंग, आइटम अधिकतम सीमा और आइटम न्यूनतम सीमा हैं। पसंदीदा रंग अल्फ़ान्यूमेरिक्स की एक पिक सूची है। आइटम की न्यूनतम और अधिकतम सीमा स्वीकार्य श्रेणी मान सेट के साथ अंक हैं। SETTING.constrained
कॉलम निर्धारित करता है कि उपयोगकर्ता संबंधित ALLOWED_SETTING_VALUE
. से चुन रहे हैं या नहीं या उन्हें USER_SETTING.unconstrained_value
दर्ज करने की आवश्यकता है या नहीं . GUI जो उपयोगकर्ताओं को उनकी सेटिंग के साथ काम करने की अनुमति देता है, उसे यह समझने की आवश्यकता है कि कौन सा विकल्प पेश करना है और SETTING.data_type
दोनों को कैसे लागू किया जाए। और min_value
और max_value
सीमाएं, यदि वे मौजूद हैं।
इस डिज़ाइन का उपयोग करके, आप उपयोगकर्ताओं द्वारा चुने गए (या दर्ज किए गए) मानों पर कुछ प्राथमिक बाधाओं/स्वच्छता जांचों को लागू करने के लिए पर्याप्त मेटाडेटा सहित स्वीकार्य सेटिंग्स को टेबल ड्राइव कर सकते हैं।
संपादित करें:उदाहरण क्वेरी
किसी दिए गए उपयोगकर्ता आईडी के सेटिंग मानों को सूचीबद्ध करने के लिए उपरोक्त डेटा का उपयोग कर कुछ नमूना SQL यहां दिया गया है:
-- 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')
;
और अब उपयोगकर्ता की सेटिंग निकालने के लिए DML:
-- 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
इसे SQL Fiddle में देखें।