Dựa trên những gì bạn đã nói tôi sẽ sử dụng lược đồ chung sau:
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])
)
Bạn không thực sự quan tâm nếu câu trả lời là số, ngày, từ, v.v. bởi vì dữ liệu là câu trả lời cho câu hỏi không phải là thứ bạn cần để thao tác trực tiếp. Hơn nữa, dữ liệu chỉ có ý nghĩa trong bối cảnh cho câu hỏi. Vì vậy, một nvarchar là cơ chế dễ đọc nhất của con người để lưu trữ dữ liệu.
Câu hỏi và câu trả lời tiềm năng sẽ được thu thập từ người dùng đầu tiên và chèn vào bảng PollQuestion và PollOption. Người dùng thứ hai trả lời các câu hỏi sẽ chọn từ danh sách các câu trả lời (true / false = list of 2). Bạn cũng có thể mở rộng bảng PollQuestion để bao gồm id người dùng của người tạo nếu thích hợp để theo dõi các câu hỏi họ tạo.
Trên giao diện người dùng của bạn, câu trả lời mà người dùng chọn có thể được gắn với giá trị PollOptionId. Cùng với PollQuestionId, bạn có thể xác minh rằng câu trả lời nhanh chóng hợp lệ cho câu hỏi. Phản hồi của họ nếu hợp lệ sẽ được nhập vào bảng PollResponse.
Có một vài vấn đề tiềm ẩn tùy thuộc vào chi tiết về trường hợp sử dụng của bạn. Nếu người dùng đầu tiên muốn sử dụng câu hỏi toán học và bạn không muốn đưa ra nhiều câu trả lời có thể. Một tình huống khác là nếu các tùy chọn mà người dùng ban đầu cung cấp không phải là các tùy chọn duy nhất mà người dùng thứ hai có thể chọn. Bạn có thể làm lại lược đồ này như sau để hỗ trợ các trường hợp sử dụng bổ sung này.
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])
)
Tôi cũng có thể sẽ thêm một ràng buộc kiểm tra để đảm bảo rằng một tùy chọn được cung cấp hoặc một phản hồi thay thế, nhưng không phải cả hai (tùy chọn và phản hồi thay thế), tùy thuộc vào nhu cầu của bạn.
Chỉnh sửa: Giao tiếp kiểu dữ liệu cho AlternateResponse.
Trong một thế giới hoàn hảo, chúng tôi có thể sử dụng các khái niệm về Generics để xử lý kiểu dữ liệu khác nhau cho AlternateReponse. Than ôi chúng ta không sống trong một thế giới hoàn hảo. Sự thỏa hiệp tốt nhất mà tôi có thể nghĩ đến là chỉ định kiểu dữ liệu AlternateResponse nên có trong bảng PollQuestion và lưu trữ AlternateReponse trong cơ sở dữ liệu dưới dạng nvarchar. Dưới đây là lược đồ câu hỏi được cập nhật và bảng kiểu dữ liệu mới:
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
)
Bạn có thể liệt kê tất cả các loại dữ liệu có sẵn cho người tạo câu hỏi bằng cách chọn từ bảng Câu hỏi Loại này. Giao diện người dùng của bạn có thể tham chiếu Câu hỏiDataTypeId để chọn định dạng phù hợp cho trường phản hồi thay thế. Bạn không bị giới hạn ở các loại dữ liệu TSQL, vì vậy "Số điện thoại" có thể là loại dữ liệu và bạn sẽ nhận được định dạng / mặt nạ phù hợp trên giao diện người dùng. Ngoài ra nếu được yêu cầu, bạn có thể chuyển dữ liệu của mình sang các loại thích hợp thông qua một câu lệnh tình huống đơn giản để thực hiện bất kỳ loại xử lý nào (chọn, xác nhận, v.v.) trên các câu trả lời thay thế.