Berdasarkan apa yang Anda katakan saya akan menggunakan skema umum berikut:
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])
)
Anda tidak benar-benar peduli jika jawabannya adalah angka, tanggal, kata, dll. Karena data adalah jawaban untuk pertanyaan, bukan sesuatu yang perlu Anda operasikan secara langsung. Selanjutnya data hanya memiliki makna dalam konteks pertanyaan. Dengan demikian nvarchar adalah mekanisme yang dapat dibaca manusia yang paling serbaguna untuk menyimpan data.
Pertanyaan dan jawaban potensial akan dikumpulkan dari pengguna pertama dan dimasukkan ke dalam tabel PollQuestion dan PollOption. Pengguna kedua yang menjawab pertanyaan akan memilih dari daftar jawaban (true / false = daftar 2). Anda juga dapat memperluas tabel PollQuestion untuk memasukkan id pengguna pembuat jika sesuai untuk melacak pertanyaan yang mereka buat.
Di UI Anda, jawaban yang dipilih pengguna dapat dikaitkan dengan nilai PollOptionId. Bersama dengan PollQuestionId Anda dapat memverifikasi bahwa jawabannya valid untuk pertanyaan dengan cepat. Respons mereka jika valid akan dimasukkan dalam tabel PollResponse.
Ada beberapa potensi masalah tergantung pada detail use case Anda. Jika pengguna pertama ingin menggunakan pertanyaan matematika, dan Anda tidak ingin menawarkan beberapa kemungkinan jawaban. Situasi lain adalah jika opsi yang disediakan pengguna awal bukan satu-satunya pilihan yang bisa dipilih pengguna kedua. Anda bisa mengerjakan ulang skema ini sebagai berikut untuk mendukung kasus penggunaan tambahan ini.
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])
)
Saya mungkin juga akan menambahkan batasan pemeriksaan untuk memastikan bahwa opsi disediakan atau respons alternatif, tetapi tidak keduanya (opsi dan respons alternatif), tergantung pada kebutuhan Anda.
Edit: Mengkomunikasikan tipe data untuk AlternateResponse.
Di dunia yang sempurna kita bisa menggunakan konsep generik untuk menangani berbagai tipe data untuk AlternateReponse. Sayangnya kita tidak hidup di dunia yang sempurna. Kompromi terbaik yang dapat saya pikirkan adalah untuk menentukan apa yang seharusnya datatype AlternateResponse dalam tabel PollQuestion, dan menyimpan AlternateReponse dalam database sebagai nvarchar. Di bawah ini adalah skema pertanyaan yang diperbarui, dan tabel tipe data baru:
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
)
Anda bisa mendaftar semua tipe data yang tersedia untuk pembuat pertanyaan dengan memilih dari tabel QuestionDataType ini. UI Anda dapat mereferensikan QuestionDataTypeId untuk memilih format yang tepat untuk bidang respons alternatif. Anda tidak terbatas pada tipe data TSQL, jadi "Nomor Telepon" bisa menjadi tipe data dan Anda akan mendapatkan pemformatan / masking yang sesuai pada UI. Jika diperlukan, Anda juga dapat mengirimkan data ke jenis yang sesuai melalui pernyataan kasus sederhana untuk melakukan segala jenis pemrosesan (pilih, validasi, dll.) Pada jawaban alternatif.