आपने जो कहा है उसके आधार पर मैं निम्नलिखित सामान्य स्कीमा का उपयोग करूंगा:
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 पर उपयुक्त स्वरूपण / मास्किंग मिल जाएगी। यदि आवश्यक हो तो आप वैकल्पिक उत्तरों पर किसी भी प्रकार की प्रसंस्करण (चयन, सत्यापन, आदि) करने के लिए एक साधारण केस स्टेटमेंट के माध्यम से अपने डेटा को उपयुक्त प्रकारों में डाल सकते हैं।