मूल्य को स्टोर करने का उचित तरीका जो कई प्रकार के हो सकते हैं


11

मेरे पास एक उत्तर तालिका और एक प्रश्न तालिका है।

जवाब तालिका एक मूल्य है, लेकिन सवाल पर निर्भर करता है, यह मान एक हो सकता है bit, nvarcharया number(अभी तक)। प्रश्न क्या अपने उद्देश्य जवाब मान प्रकार होना चाहिए की एक धारणा है।

संख्या के बाद से इन उत्तर मूल्यों को एक बिंदु या किसी अन्य पर पार्स करना महत्वपूर्ण होगा , कम से कम, इसकी तुलना करने की आवश्यकता होगी।

थोड़े और संदर्भ के लिए, कुछ उपयोगकर्ताओं द्वारा प्रश्नों और संभावित उत्तरों (आमतौर पर एक टेक्स्टबॉक्स प्रकार इनपुट के लिए अनुमत डेटा प्रकार) की आपूर्ति कुछ उपयोगकर्ताओं द्वारा की जाती है। उत्तर तब अन्य निर्दिष्ट उपयोगकर्ताओं द्वारा दिए जाते हैं।

कुछ विकल्प जो मैंने माने हैं वे हैं:

ए। एक्सएमएल या स्ट्रिंग जो कि इच्छित प्रकार के आधार पर अलग तरीके से प्राप्त की जाती है (जिसे प्रश्न में रखा गया है)

B. तीन अलग-अलग तालिकाएँ जो संदर्भ तालिका (या द्वारा संदर्भित हैं) उत्तर तालिका के आधार पर शामिल की जाती हैं। इस मामले में, मुझे यह सुनिश्चित करने के लिए सबसे अच्छा तरीका नहीं है कि प्रत्येक प्रश्न को सुनिश्चित करने के लिए बाधाओं को स्थापित करने के लिए केवल एक ही उत्तर है, या यदि वह आवेदन पर छोड़ दिया जाना चाहिए।

सी। उत्तर तालिका पर तीन अलग-अलग कॉलम जिन्हें इच्छित प्रकार के आधार पर पुनर्प्राप्त किया जा सकता है।

मैं इन दृष्टिकोणों के पेशेवरों और विपक्षों, या वैकल्पिक दृष्टिकोणों पर कुछ इनपुट प्राप्त करने में प्रसन्न हूं, जिन पर मैंने विचार नहीं किया था।

जवाबों:


2

यह वास्तव में निर्भर करता है कि आपका फ्रंट-एंड डेटा कैसे एक्सेस करता है।

यदि आप O / R-mapper का उपयोग कर रहे हैं, तो अपनी कक्षाओं के ऑब्जेक्ट-ओरिएंटेड डिज़ाइन पर ध्यान दें, न कि डेटाबेस डिज़ाइन पर। डेटाबेस तो बस वर्ग डिजाइन दर्पण। सटीक db डिज़ाइन O / R-mapper और इनहेरिटेंस मैपिंग मॉडल पर निर्भर करता है जिसका आप उपयोग कर रहे हैं।

यदि आप सीधे रिकॉर्ड सेट, डेटा-टेबल, डेटा-रीडर्स या लाइक के माध्यम से तालिकाओं तक पहुंच रहे हैं, तो एक साधारण बात यह है कि एक अपरिवर्तनीय संस्कृति का उपयोग करके मूल्यों को स्ट्रिंग में परिवर्तित करना और इसे एक साधारण टेक्स्ट कॉलम में संग्रहीत करना है। । और, ज़ाहिर है, मूल्यों को पढ़ते समय पाठ को विशेष मूल्य प्रकारों में बदलने के लिए उसी संस्कृति का फिर से उपयोग करें।

वैकल्पिक रूप से आप एक कॉलम प्रति मूल्य प्रकार का उपयोग कर सकते हैं। आज हमारे पास टेराबाइट ड्राइव हैं!

एक XML स्तंभ संभव है, लेकिन संभवतः सरल टेक्स्ट कॉलम की तुलना में अधिक जटिलता जोड़ता है और बहुत ही समान काम करता है, अर्थात् क्रमबद्ध / deserializing।

अलग किए गए तालिकाओं में चीजें करने का सही सामान्यीकृत तरीका है; हालांकि, वे काफी जटिलता भी जोड़ते हैं।

इसे सरल रखें।

प्रश्नावली डेटाबेस डिजाइन के लिए मेरा जवाब भी देखें - कौन सा तरीका बेहतर है?


4

आपने जो कहा है उसके आधार पर मैं निम्नलिखित सामान्य स्कीमा का उपयोग करूंगा:

CREATE TABLE [dbo].[PollQuestion]
(
    [PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide questions
)
CREATE TABLE [dbo].[PollOption]
(
    [PollOptionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollQuestionId] INT NOT NULL,  -- Link to the question here because options aren't shared across questions
    [OptionText] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL  -- Remove this if you don't need to hide options

    CONSTRAINT [FK_PollOption_PollQuestionId_to_PollQuestion_PollQuestionId] FOREIGN KEY ([PollQuestionId]) REFERENCES [dbo].[PollQuestion]([PollQuestionId])
)
CREATE TABLE [dbo].[PollResponse]
(
    [PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollOptionId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide answers

    CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
    CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)

यदि जवाब एक संख्या, दिनांक, शब्द, आदि है, तो आप वास्तव में परवाह नहीं करते हैं क्योंकि डेटा एक प्रश्न का उत्तर है जिसे आपको सीधे संचालित करने की आवश्यकता नहीं है। इसके अलावा डेटा केवल प्रश्न के संदर्भ में अर्थ है। इस तरह के एक nvarchar डेटा भंडारण के लिए सबसे बहुमुखी मानव पठनीय तंत्र है।

प्रश्न और संभावित उत्तरों को पहले उपयोगकर्ता से इकट्ठा किया जाएगा और पोलक्वेनेशन और पोलोशन टेबल में डाला जाएगा। दूसरा उपयोगकर्ता जो प्रश्नों का उत्तर देता है, वह उत्तरों की एक सूची (सही / गलत = 2 की सूची) से चयन करेगा। यदि आप अपने द्वारा बनाए गए प्रश्नों को ट्रैक करने के लिए उपयुक्त हैं, तो निर्माता की उपयोगकर्ता आईडी को शामिल करने के लिए आप पोलक्वेस्टियन तालिका का विस्तार भी कर सकते हैं।

आपके UI पर उपयोगकर्ता द्वारा चयनित उत्तर पोलऑप्शनआईड मान से बंधा हो सकता है। PollQuestionId के साथ मिलकर आप यह सत्यापित कर सकते हैं कि प्रश्न के उत्तर जल्दी से मान्य हैं। उनकी प्रतिक्रिया यदि वैध है तो पोलरस्पॉंस तालिका में दर्ज किया जाएगा।

आपके उपयोग के मामले के विवरण के आधार पर कुछ संभावित समस्याएं हैं। यदि पहला उपयोगकर्ता एक गणित प्रश्न का उपयोग करना चाहता है, और आप कई संभावित उत्तर नहीं देना चाहते हैं। एक अन्य स्थिति यह है कि प्रारंभिक उपयोगकर्ता द्वारा प्रदान किए जाने वाले विकल्प एकमात्र विकल्प नहीं हैं जो दूसरा उपयोगकर्ता चुन सकता है। आप इन स्कीमा का पुन: उपयोग कर सकते हैं जो इन अतिरिक्त उपयोग मामलों का समर्थन करता है।

CREATE TABLE [dbo].[PollResponse]
(
    [PollResponseId] INT NOT NULL PRIMARY KEY IDENTITY,
    [PollOptionId] INT NULL,
    [PollQuestionId] INT NOT NULL,
    [UserId] INT NOT NULL,
    [AlternateResponse] NVARCHAR(50) NULL, -- Some reasonable character limit
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide answers

    CONSTRAINT [FK_PollResponse_PollOptionId_to_PollOption_PollOptionId] FOREIGN KEY ([PollOptionId]) REFERENCES [dbo].[PollOption]([PollOptionId]),
    CONSTRAINT [FK_PollResponse_UserId_to_User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User]([UserId])
)

मैं शायद यह भी सुनिश्चित करने के लिए एक चेक बाधा जोड़ूंगा कि आपकी आवश्यकताओं के आधार पर या तो एक विकल्प प्रदान किया जाता है या एक वैकल्पिक प्रतिक्रिया, लेकिन दोनों (विकल्प और वैकल्पिक प्रतिक्रिया) नहीं।

संपादित करें: AlternateResponse के लिए डेटाटाइप का संचार।

एक आदर्श दुनिया में हम जेनेटिक्स की अवधारणा को वैकल्पिक डेटा के लिए विभिन्न डेटाटिप्स को संभालने के लिए उपयोग कर सकते हैं । काश हम एक आदर्श दुनिया में नहीं रहते। सबसे अच्छा समझौता मैं सोच सकता हूं कि यह निर्दिष्ट करने के लिए कि क्या वैकल्पिक वैकल्पिक डेटाटाइप पोलक्वेस्टियन तालिका में होना चाहिए, और डेटाबेस में अल्टरनेट रीपॉइंट को एक एनवार के रूप में संग्रहीत करें। नीचे अद्यतन प्रश्न स्कीमा और नया डेटाटाइप तालिका है:

CREATE TABLE [dbo].[PollQuestion]
(
    [PollQuestionId] INT NOT NULL PRIMARY KEY IDENTITY,
    [QuestionText] NVARCHAR(150) NOT NULL, -- Some reasonable character limit
    [QuestionDataTypeId] INT NOT NULL,
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
    [Archived] DATETIME2(2) NULL,  -- Remove this if you don't need to hide questions
    -- Insert FK here for QuestionDataTypeId
)
CREATE TABLE [dbo].[QuestionDataType]
(
    [QuestionDataTypeId] INT NOT NULL PRIMARY KEY IDENTITY,
    [Description] NVARCHAR(50) NOT NULL, -- Some reasonable character limit
)

आप इस QuestionDataType तालिका से चयन करके प्रश्न रचनाकारों के लिए सभी उपलब्ध डेटा प्रकारों को सूचीबद्ध कर सकते हैं। आपका UI वैकल्पिक प्रतिक्रिया क्षेत्र के लिए उचित प्रारूप का चयन करने के लिए QuestionDataTypeId को संदर्भित कर सकता है। आप TSQL डेटा प्रकारों तक सीमित नहीं हैं, इसलिए "फ़ोन नंबर" एक डेटा प्रकार हो सकता है और आपको UI पर उपयुक्त स्वरूपण / मास्किंग मिल जाएगी। यदि आवश्यक हो तो आप वैकल्पिक उत्तरों पर किसी भी प्रकार की प्रसंस्करण (चयन, सत्यापन, आदि) करने के लिए एक साधारण केस स्टेटमेंट के माध्यम से अपने डेटा को उपयुक्त प्रकारों में डाल सकते हैं।


0

वैसे भी ईएवी के बारे में क्या बुरा है , इस पर एक नज़र डालें EAV मॉडल पर कुछ जानकारी के लिए हारून बर्ट्रेंड द्वारा।

यह संभवतः XML या एकाधिक तालिकाओं के बजाय प्रत्येक डेटा प्रकार के लिए एक कॉलम रखने के लिए कई मायनों में बेहतर होगा।

बाधा भाग आसान है:

CHECK 
(
    CASE WHEN col1 IS NOT NULL THEN 1 ELSE 0 END + 
    CASE WHEN col2 IS NOT NULL THEN 1 ELSE 0 END + 
    CASE WHEN col3 IS NOT NULL THEN 1 ELSE 0 END = 1
)

टैग की गई इस साइट पर कई मौजूदा प्रश्न और उत्तर हैं , और शायद अन्य लोग जहां पूछने वाले को अपने प्रश्न में उस शब्द का उपयोग करने के लिए नहीं जानते थे।

मैं अत्यधिक उन लोगों के माध्यम से पढ़ने की सलाह देता हूं, क्योंकि वे संभवतः सभी पेशेवरों और विपक्षों को कवर करेंगे (यह लोगों को उनके यहां फिर से हैशिंग से रोकता है, जब वास्तव में वे बदल नहीं गए हैं)।

हारून बर्ट्रेंड द्वारा छोड़ी गई टिप्पणियों पर आधारित उत्तर


-1

मुझे लगता है कि समस्या को बहुत अधिक सोचा गया है या कुछ अतिरिक्त बाधाएं हैं कि क्यों कुछ उत्तर अधिक अकथनीय हो सकते हैं, फिर अन्य। वर्तमान में ऐसा कोई सबूत नहीं लगता है कि उत्तर को किसी भी तरह से डीबी द्वारा संसाधित किया जाना चाहिए, लेकिन सिर्फ एक लॉग फ़ील्ड के रूप में।

मैं एक NVARCHAR (MAX) के साथ जाऊंगा और फिर सामग्री को संग्रहीत / पुनर्प्राप्त करने के लिए दृश्यपटल सौदा करूंगा। संभवतः एक IS_CORRECT बिट फ़ील्ड है जहाँ उत्तर सही होने पर फ़्रंट स्टोर कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.