PHP mySQL最佳实践:关于查找的建议

6
我的问题: 我有一个MySQL数据库,其中包含类似于事实表的内容(尽管不是每个字段都是查找),以及各种其他表。当我想要显示来自“事实”表的数据时,是否需要对每个单独的查找运行查询,还是是否有一种方法可以创建一个已经完成“查找”的临时表?
示例: 表结构 -
唯一标识(自动递增int), 型号(int,从表#2查找), 类型(int,从表#2到表#3查找) 员工(int,从表#4查找) 笔记(文本) 成本(浮点数) 小时(浮点数)
因此,例如,当我要制作一个PHP页面来输入此数据时,它似乎比需要更多的“工作”:
唯一标识(未显示为数据输入字段,在提交时自动递增) 型号(下拉框。填充需要查询状态为X的表#2) 类型(只读文本框显示型号类型。根据表#2的列基于表#3进行查询) 员工(下拉框。填充需要查询员工状态为“活动”的表#4) 注释(文本框,用户输入相关提交说明) 成本(文本框,用户输入与提交相关的费用) 小时(文本框,用户输入与提交相关的小时数)
仅仅为了获得一个简单的表单填充有效数据需要进行大量的查询/查找,这是最好的方法吗?是否有更好的方法?
附:我控制数据结构,因此,如果问题是数据库设计,则这些建议也将有所帮助。

似乎下拉框正在被文本字段所取代,这些文本字段会自动完成输入的数据,就像在FB和Google上看到的那样。 - Frank
那是个好点子,弗兰克。我可以把那些下拉框改成自动完成文本框。我以前在其他几个项目中用过这种方法。但是,这仍然无法解决查找问题。即使我使用自动完成,我仍然需要查找下一个相关值来填充“只读”字段。除非我漏掉了什么? - Edward
此外,使用文本框方法,您将对单独的PHP脚本进行Ajax调用。考虑一下,即使是在下拉列表中,您也可能会这样做。 - Frank
2个回答

0

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

MySQL包括内置的缓存系统,可以消除类似查询的许多服务器周期。您可以在此处找到更多信息-> MySQL Caching

至于您的数据库结构,如果您想要一些建议,您需要提供有关模式(数据库的用途)的更多详细信息。不知道它应该做什么很难知道哪种结构有效。(每个员工有多个注释,成本是多少?他们是每个员工吗?等等)


不,我说的不是缓存。我说的是构建一个已经完成查找的表格。当您查看事实表时,每个列主要都只有数字。其中大多数数字代表另一个表的主键。因此,为了向用户呈现有意义的数据,我必须在其他表上查找该键,并获取代表人类可读数据的列。然后继续为每个查找执行此操作,这就是为什么我说“每个单独查找查询一次”的原因。 - Edward

0

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

有些人做的很好的方法是渲染表单的部分HTML输出,并将所有数据填充为下拉菜单、单选按钮等。然后将该部分HTML存储在memcached键下,这样您就不必为大多数PHP请求执行任何数据库查询或HTML渲染——您只需从memcached中获取预填充的HTML片段并原样输出即可。我认为这就像是基于数据库的输出的"Ikea"。

当然,如果您曾经更改过维度表中的数据,则需要使缓存的HTML失效,或者更好的是重新生成它并将新版本的HTML存储在memcached中。

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


比尔 - 我以前从未听说过这个,但我是一个新手。听起来很有趣,也符合我的需求。你说得对,我的维度表很少甚至不会改变。它们充满了静态值,然后被提取到事实表中。此外,你关于宜家的类比真的让我理解了你的答案。你有这方面的示例链接吗?这样问是否太过分了? - Edward
这是一篇关于 Python 应用程序的文章,展示了我所说的内容,但同样的技术也被 PHP 和 Ruby 开发人员广泛使用:http://code.google.com/appengine/docs/python/memcache/usingmemcache.html - Bill Karwin

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