最佳数据库存储方法

3
我的软件(用PHP编写)允许用户使用HTML表单输入他们的“简历”信息。这个“简历”包括用户的教育、工作经历、奖项、求职信等多个元素,每个元素包含的数据都是独特的。例如,教育需要填写毕业年份、学校名称、学位等字段。
我的问题是,将简历数据存储在MySQL数据库中的最佳方法是什么?我目前的选择有:
- 为每个简历元素创建单独的表(如resume_education、resume_awards等); - 使用一个包含所有简历元素的单一表,并以多维数组的形式插入元素数据(例如,一个包含简历数据的表,具有诸如education、workhistory等列。education或类似字段中的数据将被编译成类似于("grad_year"=>"1990", "school_name"=>"Cool School")的数组,其中指示字符的使用表示新字段)。
第一种选择提供了易于维护和编码的优点,而第二种选择似乎可以大幅减少备份和加载时间以及数据库维护。也许还有更好的方法?你会推荐哪种方法呢?

实际上,你的正反面评估完全相反了! - Francis Avila
我认为,相比于尝试在单个表中遍历多个多维数组,使用多个表会更容易维护。但是,我也能理解你的想法,因为我不确定这两种方法对加载时间的影响。 - cbronson
我不会担心这么简单的东西的加载时间。多个表与连接是一个不错的选择。 - shapeshifter
这只是整个用户配置文件的一个单独元素,需要支持多个用户和条目。 - cbronson
3个回答

1

选项2显然是错误的。如果您不打算将数据分解为行和列,并遵循数据规范化的前几个规则,那么使用关系型数据库就没有理由(您可以在文件系统文件夹中使用XML文档)。

选项1可能是最正确的。如果所有元素都应该出现在所有简历中,并且没有元素在简历中重复,则实际上可以为整个简历创建一个表,每个字段都在其自己的列中。由于我不认为这些条件得到满足(例如,工作经历和教育可能是可重复的元素),因此每个元素单独使用表是正确的选择。


1
我会选择使用多个表,但不要给它们命名为具体的名称,而是使用更通用的名称。
例如:表格。
resume_section
id,name
1,personal details
2,education
3,work history

resume_section_attributes
id,resume_section_id,name
1,1,name
2,1,phone
3,1,email
4,2,school_name
5,2,grad_year
6,3,company_name
7,3,number_of_years

user_resume
id,user_id,resume_section_attribute_id,value
1,99,1,My Name
2,99,2,12345678

现在,当您想要构建用户的简历时,您可以直接访问用户简历表并获取其所有详细信息,并与属性表连接以获取属性名称等信息。您可以更改属性的显示顺序,轻松添加新属性,将它们设置为必需或非必需,为电话号码或其他内容设置限制。扩展的可能性是无限的。

1
你会处理那种数量级吗?而且这真的取决于你的数据。你想硬编码电话号码和移动电话,还是允许用户添加尽可能多的号码。这条评论总结了它,规范化模型允许n个用户电话号码、屏幕名称、从属关系和工作历史。它也不关心这些项目的顺序。 - shapeshifter
1
实际上,这可能更糟。现在你要为一个简历使用多个表格,你需要对它们进行索引并跨所有表格查询。如果你想添加一个新字段怎么办?创建一个新表格并进行所有硬编码以使其工作。想象一下,你只需添加一个新属性,设置其名称、所属部分和该部分内的顺序,然后就可以填写了。 - shapeshifter
1
我只是提供了一个通用的表格想法,你需要编写代码。但我的意思是,如果你从通用的角度来看待它,将来会更容易。此外,你可能会学到很多,并拥有一个不错的软件展示。 - shapeshifter
1
如果你想看一下泛型尺度的极端例子,可以看看Drupal的节点和内容类型。你基本上可以用它们创建任何东西。我不使用Drupal,但我已经了解了他们是如何做到的。 - shapeshifter
1
没问题!就像那些文章所说的,这并不总是最佳选择。但我认为这个应用程序非常适合学习如何做到这一点,它并不过于复杂,而且在未来需要允许无限电话号码或联系人等时,您将能够重复使用这些想法。尽量不要在代码中硬编码任何内容,因此当您在个人详细信息下添加新属性时,它将自动出现在您的表单中,而无需任何额外的代码。例如,从数据库构建表单。 - shapeshifter
显示剩余4条评论

0

绝对选择选项1。良好的数据库设计至关重要,而良好的数据库设计涉及将数据规范化,只有在您使用自己的表对不同实体进行建模时才能实现。

请查看这篇关于数据库规范化的文章,其中有一个很好的讨论相关概念。


谢谢你提供的链接,我会再次查看一下(我几个月前也看到过这个链接)。不好意思,我不小心按了回车键。无论如何,就数据库本身的设计而言,我认为列内容本身对设计没有影响,对吗? - cbronson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接