我的数据库设计有问题。 我有两个选择,但没有一个能真正解决我的问题:
选项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”字段的数据类型可能真的是一切!为了解决这个问题我想到了
对我而言,似乎都不对。
选项2:
FB (ID, Year, Q1, Q2, …., Q2500)
1| 2004 | hello| 56€ |,....,| 15.2.12
1| 2003 | bye | …...|,….., |…..
2| 2003 | salut| 55€ |, …..,|…..
问题数量(Q1-QX)可能会有很大差异。
任何建议表示赞赏!感谢...
答案 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。不幸的是,我没有时间编写该代码。