具有不同答案数据类型的许多问题的数据库设计

时间:2012-03-02 08:56:05

标签: database database-design

我的数据库设计有问题。 我有两个选择,但没有一个能真正解决我的问题:

选项1:

FB (ID, Year, Question, Value)  
    1 | 2004| Q1      | hello  
    1 | 2004| Q2500   | 15.2.12  
    1 | 2004| Q2      | 56€  
    1 | 2003| Q1      | bye  
    2 | 2003| Q2      | 55€  

选项1的问题是“Value”字段的数据类型可能真的是一切!为了解决这个问题我想到了

  1. 为每种数据类型或
  2. 创建一个表
  3. 将表格更改为FB(ID,年份,问题,Valueint,Valuestring,...等。)
  4. 对我而言,似乎都不对。

    选项2:

       FB (ID, Year,   Q1,    Q2,   ….,   Q2500)   
        1| 2004 | hello| 56€ |,....,| 15.2.12  
        1| 2003 | bye  | …...|,….., |…..  
        2| 2003 | salut| 55€ |, …..,|…..    
    

    问题数量(Q1-QX)可能会有很大差异。

    任何建议表示赞赏!感谢...

2 个答案:

答案 0 :(得分:2)

我会去

CREATE TABLE Questions (
   QuestionID varchar(5) not null primary key,
   AnswerType varchar(10) not null,
   constraint CK_Question_Types CHECK (AnswerType in ('INT','CHAR','BOOL')), --Add more appropriate type names
   constraint UQ_Questions_TypeCheck UNIQUE (QuestionID,AnswerType)
)

CREATE TABLE Answers (
    ID int not null,
    Year int not null,
    QuestionID varchar(5) not null,
    AnswerType varchar(10) not null,
    IntAnswer int null,
    CharAnswer varchar(max) null,
    BoolAnswer bit null,
    constraint FK_Answers_Questions FOREIGN KEY (QuestionID) references Questions,
    constraint FK_Answers_Question_TypeCheck FOREIGN KEY (QuestionID,AnswerType) references Questions (QuestionID,AnswerType),
    constraint CK_Answer_Types CHECK (
       (IntAnswer is null or AnswerType='INT') and
       (CharAnswer is null or AnswerType='CHAR') and
       (BoolAnswer is null or AnswerType='BOOL') and
       (IntAnswer is not null or CharAnswer is not null or BoolAnswer is not null)
    )
 )

这可以确保每个答案都是正确的类型,而不是null,同时确保表格中没有任何无关的数据。


使用两个外键不需要 (您可以删除FK_Answers_Questions),但我更愿意记录真正的FK引用在QuestionID上,我们希望使用第二个约束和新的CHECK约束来强制执行表格约束。

答案 1 :(得分:0)

我会创建两个表:

Create Table tblQuestions (
     ID int IDENTITY(1,1) NOT NULL,
     Year varchar(4) Default '',
     QuestionText varchar(4000) Default '',
     AnswerDataType varchar(50) Default '' )

Create Table tblAnswers (
     ID int IDENTITY(1,1) NOT NULL,
     tblQuestions_ID int Default 0,
     Answer varchar(255) Default '' )

然后我会创建一个函数或sproc来验证是否以正确的数据类型给出了答案并返回TRUE或FALSE。不幸的是,我没有时间编写该代码。