关于查找的PHP mySQL最佳实践

时间:2011-12-11 03:26:54

标签: php mysql database-design

我的问题: 我有一个mysql数据库,它包含一个事实表(虽然不是每个字段都是查找)和各种其他表。当我想显示来自该“事实”表的数据时,是否有必要对每个单独的查找运行查询是否有办法制作一个已经完成“查找”的临时表?

实施例: 表结构 -

  • unique_id(自动增量int),
  • model(int,查找表#2),
  • type(int,从表#2查找到表#3)
  • employee(int,查找表#4)
  • 注释(文本)
  • 成本(浮点)
  • 小时(浮点)
  •   -

因此,例如,当我想创建一个php页面来输入这些数据时,它似乎比它需要的更多“工作”:

  • unique_id(未显示为数据输入字段,自动递增 提交)

  • 模型(下拉框。填充需要查询表#2,其中status = X)

  • type(只读文本框显示模型类型。需要根据表#2中的列查询表#3)

  • 员工(下拉框。填充需要查询表#4,其中employee_status =“有效”)

  • 备注(文本框,用户输入相关提交注释)

  • 费用(文本框,用户输入与提交相关的费用)

  • 小时(文本框,用户输入与提交相关的小时数)

只是为了获得一个填充了有效数据的简单表单,需要我看起来像 A LOT 的查询/查找。

这是最好的方法吗?有没有更好的办法?

除此之外:我可以控制数据结构,所以如果问题是数据库设计,那么这些建议也会有所帮助。

2 个答案:

答案 0 :(得分:0)

我不太确定“对每个查询的查询”是什么意思。你的意思是一种在PHP脚本中保存整个表的方法吗?或者你的意思是在mysql服务器上缓存以消除数据库节点上的进程资源?

MySQL包含一个内置的缓存系统,可以消除类似查询的大量服务器周期。你可以在这里找到更多 - > MySQL Caching

就数据库结构而言,如果您需要一些建议,则必须提供有关模式的更多详细信息(数据库的用途)。很难知道什么样的结构有效,并且在不知道它应该做什么的情况下是有效的。 (每个员工有多个备注,成本是多少?他们是每个员工吗?等等)

答案 1 :(得分:0)

维度表通常不会经常更改,至少相对于事实表的插入数量而言。维度表也比事实表小得多。这使维度表成为缓存的理想选择。

有些人做得好的是为表单呈现部分HTML输出,所有数据都填充为下拉列表,单选按钮等。然后将该部分HTML存储在memcached键下,这样您就不必这样做了任何数据库查询或大多数PHP请求的HTML呈现 - 您只需从memcached中获取预先填充的HTML片段并逐字回显。我认为这就像数据库驱动输出的“宜家”。

当然,如果您更改维度表中的数据,则需要使缓存的HTML无效,甚至更好地重新生成它并在memcached中存储新版本的HTML。

关于完成所有查找,我会指出不需要在事实表中使用伪讽刺。您可以使用自然值,并使它们引用维度表的主键,也可以是自然键而不是伪键。在某些情况下可能需要更多空间,但它会消除查找。当然,对于长变量的维度继续使用伪焦点可能是有意义的。