规范化调查数据库

时间:2014-05-23 15:36:51

标签: sql join normalize

所以我试图规范化我的数据库并且无法弄清楚如何做到这一点(我对这一切都很陌生)。

我有5张桌子正在玩。第一个拥有我的所有数据,是我原来的超级表。其他4个是新的标准化版本。请注意,Joe Blow条目只是一个例子,实际上除了答案表(我试图填充数千个新条目的那个)之外,我在所有这些条目上都有成千上万的条目:

  

表:问题(原始非标准化表)

     

unique_ID(PK)|回答|问题| PNAME

     

2000 |是|你对生活感到满意吗? | Joe Blow

     

我的新表确实相同,除非这次我使用了所有键:

  

表:答案

     

unique_ID(PK)| answer_ID(FK)| question_ID(FK)| person_ID(FK)

     

所以这就是说,我试图弄清楚如何使用insert into语句来完成这项工作。其他表格将ID与数据相匹配,并且它们当前已填充:

  

表:answers_only

     

answer_ID(FK)|答案

     

3555 |是

     
     

表:questions_only

     

question_Id(FK)|问题

     

4231 |你对生活感到满意吗?

     
     

表:用户

     

person_ID(PK,FK)| PNAME

     

2212 | Joe Blow

     
     

所以基本上第一部分是这样的:   INSERT INTO答案(person_ID,answer_ID,question_ID)VALUES(person_ID,answer_ID,questionID)

我只是不知道如何获得这些价值

2 个答案:

答案 0 :(得分:0)

根据您描述的方式,Table: Questions实际上位于3NF
1NF - >表格是平的(即一个答案栏中没有两个答案)
2NF - >表格列在主键上是functionally dependent整体(即答案,问题,人都依赖于unique_id)
3NF - >非候选键表列不是functionally dependent

Note:我会从unique_id表中移除answers密钥,这似乎是多余的。

对于插入,您可以为每列使用子查询

INSERT INTO answers(person_ID,answer_ID,question_ID)
SELECT (SELECT person_ID FROM user WHERE pName = 'Joe Blow'),(SELECT answer_ID FROM answers_only WHERE answer = 'Yes'), (SELECT question_ID FROM questions_only WHERE question = 'Are you Happy with Life?')

答案 1 :(得分:0)

我会看两种方法。第一个将有这些表:

person - PersonId, name, etc
Survey - SurveyId, name, etc
Question - QuestionId, text, etc
Answer - AnswerId, text, etc

SurveyQuestion - SurveyId, QuestionId, etc
SurveyAnswer - SurveyId, QuestionId, PersonId, AnswerId, etc

第二个没有答案表,SurveyAnswer表将有一个varchar字段用于答案,而不是AnswerId字段。

关于Question,Answer,SurveyQuestion和SurveyAnswer表中的etc,我喜欢给我的所有记录加时间戳。但是,这只是我。