【问题标题】:Best Database Storage Method最佳数据库存储方法
【发布时间】:2012-12-21 21:40:29
【问题描述】:

我的软件(用 PHP 编写)允许用户使用 HTML 表单为他们的“简历”输入信息。这个“简历”有几个不同的元素,包括用户的教育、工作经历、奖励、求职信等。每个元素在其包含的数据中都是独一无二的。比如教育需要毕业年份、学校名称、学位等字段。

我的问题是,将简历数据存储在 mySQL 数据库中的最佳方法是什么?我目前的选择是:

  • 为每个简历元素(resume_education、resume_awards 等)创建单独的表
  • 对简历的所有元素使用一张表,并以多维数组的形式插入元素数据。 (即:一张表,其中包含教育、工作历史、等等等列的简历数据。教育或类似领域的数据将被编译成一个数组,例如 ("grad_year"=>"1990", "school_name"=>" Cool School”)或类似的东西,其中使用指示字符表示新字段)。

第一种选择提供了易于维护和编码,而第二种选择似乎可以显着减少备份和加载时间以及数据库维护。也许有更好的方法?你会推荐什么?

【问题讨论】:

  • 实际上你的赞成和反对评估完全相反!
  • 好吧,我认为多个表更易于维护,而不是尝试在单个表中遍历多个多维数组。但我确实知道您可能来自哪里,因为我不确定这两种方法对加载时间的影响。
  • 我不会担心这么简单的东西的加载时间。多个带有连接的表是一个不错的选择。
  • 这只是整个用户配置文件中的一个元素,需要支持许多用户和条目。

标签: php mysql database normalization organization


【解决方案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

现在,当您要构建用户简历时,您可以直接进入用户简历表并获取他们的所有详细信息并加入属性表以获取属性名称等。您可以更改显示的 attrs 顺序,轻松添加新的。根据需要或不设置它们。为电话号码或其他东西的数量设置限制。扩展的可能性是无穷无尽的。

【讨论】:

  • 你会处理那种音量吗?另外,这实际上取决于您的数据。您是要硬编码电话号码和手机还是允许用户添加任意​​数量的号码。这条评论总结了它,规范化模型允许 n 个用户电话号码、屏幕名称、从属关系和工作历史。它也不关心这些项目的顺序。
  • 实际上可能更糟。您现在为一份简历谈论许多表,您需要将它们全部索引并查询所有表。如果要添加新字段怎么办?创建一个新表并执行所有硬编码以使其正常工作。想象一下,您只需添加一个新属性,设置它的名称、它在哪个部分以及它在该部分中的顺序,然后敲击它以供填写。
  • 我只是提供了一个通用表格的想法,您需要编写代码。但是我要说的是,如果您从通用的角度来处理它,它将在将来变得更容易。另外,您可能会学到很多东西,并且有一个不错的软件可以炫耀。
  • 如果您想要通用规模的极端示例,请查看 Drupals 节点和内容类型。你基本上可以用这些创造任何东西。我不使用drupal,但我读过他们是如何做到的。
  • 没问题!就像那些文章所说的那样,它并不总是最好的选择。但我认为这个应用程序是学习如何做的理想选择,它并不过分复杂,你可以在未来需要时重用这些想法,以允许无限的电话号码或联系人等。尽量不要硬编码你的任何东西例如,当您在个人详细信息下添加新属性时,它将自动出现在您的表单中,而无需任何额外代码。例如。从数据库构造表单。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    看看this article on database normalization,它对所涉及的概念进行了很好的讨论。

    【讨论】:

    • 谢谢你的链接,我会再看一遍(几个月前我也看到了)。不好意思不小心按了回车,反正就数据库本身的设计而言,我看列本身的内容对设计没有影响吧?
    猜你喜欢
    • 2014-05-20
    • 2012-04-10
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2012-03-07
    • 2011-09-07
    相关资源
    最近更新 更多