【问题标题】:PHP mySQL best practices regarding lookups关于查找的 PHP mySQL 最佳实践
【发布时间】:2011-12-11 03:26:53
【问题描述】:

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

示例: 表结构 -

  • unique_id(自动增量 int),
  • 模型(int,查找表#2),
  • type(int, 从表 #2 到表 #3 查找)
  • 员工(int,查找表 #4)
  • 笔记(文字)
  • 成本(浮动)
  • 小时(浮点数)
  • -

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

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

  • 模型(下拉框。人口需要查询表 #2,其中状态 = X)

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

  • 员工(下拉框。人口需要查询表 #4,其中employee_status = "Active")

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

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

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

仅仅为了获得一个包含有效数据的简单表单,就需要在我看来很多查询/查找。

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

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

【问题讨论】:

  • 似乎下拉框正在被自动完成输入数据的文本字段所取代,就像您在 FB 和 google 上看到的那样。
  • 弗兰克说得好。我可以将这些下拉框更改为自动完成的 txt 框。我过去曾将它们用于其他一些事情。但是,这仍然不能解决查找问题。即使我自动完成,我仍然需要查找下一个关联值来填充“只读”字段。除非我在这里遗漏了什么?
  • 另外,使用文本框 approack,您将进行 ajax 调用以分离 php 脚本。想一想,即使使用下拉列表,您也可能会这样做。

标签: php mysql database-design


【解决方案1】:

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

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

当然,如果您确实更改了维度表中的数据,您可能希望使缓存的 HTML 无效,或者甚至更好地重新生成它并将新版本的 HTML 存储在 memcached 中。

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

【讨论】:

  • Bill - 我以前从未听说过,但我是新手。听起来很有趣,并且符合我正在寻找的内容。你是对的,我的维度表不会经常改变,如果有的话。它们充满了静态值,然后被拉入事实表。另外,您对宜家的类比确实使您的回答对我有意义。你有这个例子的链接吗?这要求太多了吗?
  • 这是一篇文章,展示了我正在谈论的 Python 应用程序,但 PHP 和 Ruby 开发人员广泛使用了相同的技术:code.google.com/appengine/docs/python/memcache/…
【解决方案2】:

我不太清楚您所说的“对每个单独查找的查询”是什么意思。您的意思是一种将整个表格保存在 php 脚本中的方法吗?还是你的意思是在mysql服务器上缓存,以消除数据库节点上的进程资源?

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

就您的数据库结构而言,如果您需要一些建议,您将不得不提供有关您的架构(您的数据库的用途)的更多详细信息。在不知道它应该做什么的情况下,很难知道哪种结构有效且有效。 (每个员工是否有多个笔记,什么是成本?是每个员工吗?等等)

【讨论】:

  • 不,我不是在谈论缓存。我说的是建立一个已经完成查找的表。当您查看事实表时,主要是每列中的数字。这些数字中的大多数代表另一个表的主键。因此,为了将数据呈现给用户,数据是有意义的,我必须在另一个表上查找该键,并获取代表人类可读数据的列。然后继续为每个查找执行此操作,这就是为什么我说“每个单独查找的查询”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多