Söylediklerinize dayanarak aşağıdaki genel şemayı kullanacağım:
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])
)
Cevabın bir sayı, tarih, kelime vb. Olup olmadığını gerçekten umursamazsınız çünkü veriler doğrudan üzerinde çalışmanız gereken bir şey değil, bir soruya cevaptır. Ayrıca verilerin sadece soru bağlamında bir anlamı vardır. Bu nedenle bir nvarchar, verileri depolamak için en çok yönlü insan tarafından okunabilir mekanizmadır.
Soru ve potansiyel cevaplar ilk kullanıcıdan toplanacak ve PollQuestion ve PollOption tablolarına eklenecektir. Soruları cevaplayan ikinci kullanıcı cevap listesinden seçim yapacaktır (true / false = 2 listesi). Ayrıca PollQuestion tablosunu, oluşturdukları soruları izlemek için uygunsa yaratıcının kullanıcı kimliğini içerecek şekilde genişletebilirsiniz.
Kullanıcı arayüzünüzde kullanıcının seçtiği yanıt PollOptionId değerine bağlanabilir. PollQuestionId ile birlikte cevabın soru için hızlı bir şekilde geçerli olduğunu doğrulayabilirsiniz. Geçerliyse yanıtları PollResponse tablosuna girilir.
Kullanım durumunuzun ayrıntılarına bağlı olarak birkaç potansiyel sorun vardır. İlk kullanıcı matematik sorusu kullanmak istiyorsa ve birden fazla olası cevap sunmak istemiyorsanız. Başka bir durum, ilk kullanıcının sağladığı seçenekler ikinci kullanıcının seçebileceği tek seçenek değilse. Bu ek kullanım durumlarını desteklemek için bu şemayı aşağıdaki gibi yeniden çalıştırabilirsiniz.
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])
)
Ayrıca muhtemelen bir seçeneğin sağlandığından veya alternatif bir yanıt olduğundan emin olmak için bir kontrol kısıtlaması eklerim, ancak ihtiyaçlarınıza bağlı olarak (seçenek ve alternatif yanıt) değil.
Düzenleme: AlternateResponse için veri türünü iletme.
Mükemmel bir dünyada, jenerikler kavramını AlternateReponse için çeşitli veri türlerini ele almak için kullanabiliriz. Ne yazık ki mükemmel bir dünyada yaşamıyoruz. Düşünebileceğim en iyi uzlaşma, AlternateResponse veri tipinin PollQuestion tablosunda ne olması gerektiğini belirtmek ve AlternateReponse'u veritabanında nvarchar olarak depolamaktır. Güncelleştirilmiş soru şeması ve yeni veri türü tablosu aşağıdadır:
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
)
Bu QuestionDataType tablosundan seçim yaparak soru yaratıcıları için mevcut tüm veri türlerini listeleyebilirsiniz. Kullanıcı arayüzünüz, alternatif yanıt alanı için uygun biçimi seçmek üzere QuestionDataTypeId dosyasına başvurabilir. TSQL veri türleriyle sınırlı değilsiniz, bu nedenle "Telefon Numarası" bir veri türü olabilir ve kullanıcı arayüzünde uygun biçimlendirme / maskeleme elde edersiniz. Ayrıca gerekirse, alternatif cevaplar üzerinde her türlü işlem (seçme, doğrulama, vb.) Yapmak için verilerinizi basit bir vaka bildirimi yoluyla uygun türlere aktarabilirsiniz.