จากสิ่งที่คุณพูดฉันจะใช้สคีมาทั่วไปดังต่อไปนี้:
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 เป็นกลไกที่มนุษย์สามารถอ่านได้หลากหลายที่สุดในการจัดเก็บข้อมูล
คำถามและคำตอบที่อาจเกิดขึ้นจะถูกรวบรวมจากผู้ใช้คนแรกและแทรกลงในตาราง PollQuestion และ PollOption ผู้ใช้รายที่สองที่ตอบคำถามจะเลือกจากรายการคำตอบ (จริง / เท็จ = รายการ 2) คุณสามารถขยายตาราง PollQuestion เพื่อรวมรหัสผู้ใช้ของผู้สร้างได้หากเหมาะสมเพื่อติดตามคำถามที่พวกเขาสร้าง
บน UI ของคุณคำตอบที่ผู้ใช้เลือกสามารถเชื่อมโยงกับค่า PollOptionId ร่วมกับ PollQuestionId คุณสามารถตรวจสอบว่าคำตอบนั้นถูกต้องสำหรับคำถามอย่างรวดเร็ว การตอบสนองของพวกเขาหากถูกต้องจะถูกป้อนในตาราง PollResponse
มีปัญหาที่อาจเกิดขึ้นสองสามประการขึ้นอยู่กับรายละเอียดของกรณีการใช้งานของคุณ หากผู้ใช้คนแรกต้องการใช้คำถามคณิตศาสตร์และคุณไม่ต้องการเสนอคำตอบที่เป็นไปได้หลายคำ อีกสถานการณ์คือถ้าตัวเลือกที่ผู้ใช้เริ่มต้นไม่ได้เป็นเพียงตัวเลือกเดียวที่ผู้ใช้คนที่สองสามารถเลือกได้ คุณสามารถทำสคีมาใหม่นี้เพื่อรองรับกรณีการใช้งานเพิ่มเติมเหล่านี้
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
ในโลกที่สมบูรณ์แบบเราสามารถใช้แนวคิดของgenericsเพื่อจัดการประเภทข้อมูลต่างๆสำหรับ AlternateReponse อนิจจาเราไม่ได้อยู่ในโลกที่สมบูรณ์แบบ การประนีประนอมที่ดีที่สุดที่ฉันคิดได้คือการระบุว่าประเภทข้อมูล AlternateResponse ควรอยู่ในตาราง PollQuestion และเก็บ AlternateReponse ในฐานข้อมูลเป็น nvarchar ด้านล่างนี้เป็นสคีคำถามที่อัปเดตแล้วและตารางประเภทข้อมูลใหม่:
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 ที่เหมาะสม นอกจากนี้หากต้องการคุณสามารถส่งข้อมูลของคุณไปยังประเภทที่เหมาะสมผ่านคำสั่งกรณีง่ายเพื่อทำการประมวลผลทุกชนิด (เลือก, การตรวจสอบ, ฯลฯ ) ในคำตอบอื่น