所以我试图规范化我的数据库并且无法弄清楚如何做到这一点(我对这一切都很陌生)。
我有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)
我只是不知道如何获得这些价值
答案 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,我喜欢给我的所有记录加时间戳。但是,这只是我。