2010-12-21 79 views
1

我正在编写一个在线应用程序表单,我试图收集的其中一条数据是用户的教育历史;学校名称,学校城市,他们在那里的年份和成就。这些数据可以在零到大约四个不同学校之间的任何地方收集,并且如果需要,用户将动态地添加更多字段。将未知行数插入到MySQL数据库中

我的问题是如何在数据库中捕获这个问题,因为我不知道用户将添加多少学校?它可以在一个表格中完成,还是需要创建多个表格并在单独的表格中捕获教育数据?

任何帮助或指针将不胜感激。

谢谢。

+3

我建议你阅读WikiPedia文章[数据库规范化](http://en.wikipedia.org/wiki/Database_normalization)... – ircmaxell 2010-12-21 13:59:07

回答

3

您需要单独的表格。一人一人一人,另一人每学校一排。学校可以使用在学校桌上使用personID的人或者代表“人上学”关系的附加表。

任何一个实体(人)与多个其他实体(学校)的任何关联都需要多个表。一个遵循的通用规则是每个“实体”一个表,另外还有用于多对多关系的附加表。

1

为教育制作一张单独的表格,并将php中的“教育”建模为一个单独的课程。

1

这个术语是标准化。您想要构建多个表,以便一行数据简洁,并且尽可能少地重复信息。这可以通过在你的脑海中找出哪些信息将被重复,并为这些信息制作一张表格来完成。

表之间的数据通过主键链接(希望自动增加整数)。在这种情况下,你会有两张表:学生和教育。学生表将具有“学生ID,姓名等”,而教育表将具有“教育ID,学生ID,学校名称,学校城市,学生学生ID等”。

注意Student.StudentID将匹配Education.StudentID,可以用下面的查询来获得:

select Student.*, Education.* from Student left join Education on Student.StudentID = Education.StudentID 

事实上,这将有“SchoolName”和“SchoolCity”重复一遍又一遍,所以这还没有完全标准化。要继续,你需要再次改变它一点点:

Student: StudentID, Name, etc 
School: SchoolID, SchoolName, SchoolCity, etc 
Education: StudentID, SchoolID, StudentSchoolID, etc 

注:每个学生都有在每次上学不同的学生证 - 不自动递增整数混淆“StudentID”。要获得这种情况下的列表:

select Student.*, Education.StudentSchoolID, School.* from 
    Student left join Education on Student.StudentID = Education.StudentID 
    left join School on Education.SchoolID = School.SchoolID