用于动态表单创建的高效MySQL数据库结构

时间:2011-02-01 05:31:51

标签: mysql database

我正在使用Codeigniter创建一个应用程序,它允许任何人在不登录的情况下创建使用不同输入类型(使用文本框,下拉列表,复选框等)填写的表单。这个表格可以是1-100个问题,一旦完成,它将通过电子邮件发送给其他人,然后将其填写在网站上。

我首先设置类似于this post的MySQL数据库,其中包含很多不同的表,只有几列。然后我索引并使用外键来链接信息。

从那时起,我已经更改并设置了这样的数据库,因此我减少了查询次数:

Document
  id, name, email, recipientname, recipientemail, document name
Document Questions
  document_id, question_id, question, type, comments

是否有更多的表包含更少的列但更多的查询比我现在这样做更有效?我知道normalization扮演一个角色,但是你的桌子如此特别小,会在多大程度上妨碍你的表现呢?

1 个答案:

答案 0 :(得分:1)

从标准化的角度来看,您可以采取一些措施来进一步规范化数据(收件人可以拥有自己的实体和类型),但这并不总是访问数据的最佳方式。

例如,如果您将问题分成4个不同的实体(类型可以很容易地成为ENUM):

Documents
Document Questions
Recipients
Types

然后,为您的应用程序获取单个表单,您将执行具有多个联接的查询。如果您正在使用MyISAM,那么所有四个表都会被锁定,直到查询完成。具有错误连接和错误索引的查询可能变得非常慢。

更好的选择是在数据库上执行四个单独的查询(添加相对于您正在运行的最常见查询的索引)来检索数据,这样表将保持锁定一段较短的时间。

我知道这是一个极端的例子,但我会更专注于你的指数优化,并在规范化和性能之间取得良好的平衡。

总之,有时完全标准化的数据意味着性能下降。