Php 筛选MySQL结果的最佳实践
我想在我的PHP项目中实现一个过滤器函数。 为了实现一个过滤器,我通常只在查询中添加一个WHERE子句来显示过滤结果 我的问题是: 这些过滤器不仅需要添加smple WHERE子句,还需要一个包含多个联接的大查询。结果查询的行数超过30行 稍后,还应该有一个搜索功能,这将需要这个巨大的查询。 我想知道这是否是一种好的做法,或者我是否应该在数据库表中添加一个“冗余”数据库列,在该列中计算每次更新时过滤所需的属性。 有了这个专栏,我就不会在项目的不同地方进行大量的查询,而是有一个多余的专栏 你觉得怎么样 问候 如有疑问,这里是表格结构/代码。这不是确切的代码,因为还有一个修订系统,使其更加复杂,但要理解这一点就足够了: 表格提交:Php 筛选MySQL结果的最佳实践,php,mysql,join,filter,Php,Mysql,Join,Filter,我想在我的PHP项目中实现一个过滤器函数。 为了实现一个过滤器,我通常只在查询中添加一个WHERE子句来显示过滤结果 我的问题是: 这些过滤器不仅需要添加smple WHERE子句,还需要一个包含多个联接的大查询。结果查询的行数超过30行 稍后,还应该有一个搜索功能,这将需要这个巨大的查询。 我想知道这是否是一种好的做法,或者我是否应该在数据库表中添加一个“冗余”数据库列,在该列中计算每次更新时过滤所需的属性。 有了这个专栏,我就不会在项目的不同地方进行大量的查询,而是有一个多余的专栏 你觉得怎
ID (primary)
(additionalColumns)
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
reportID (reference to reports table, multiple report_object for one report)
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
表格报告:
ID (primary)
(additionalColumns)
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
reportID (reference to reports table, multiple report_object for one report)
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
表格报告对象:
ID (primary)
(additionalColumns)
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
reportID (reference to reports table, multiple report_object for one report)
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
表格会计:
ID (primary)
(additionalColumns)
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
reportID (reference to reports table, multiple report_object for one report)
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
表记帐对象:
ID (primary)
(additionalColumns)
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
reportID (reference to reports table, multiple report_object for one report)
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
对于提交,将创建一个或多个报告,其中包含多个要考虑的对象(报告对象)。
对于每个报表,我可以创建多个会计科目,其中每个会计科目针对报表的几个对象。会计报表对象存储在会计报表对象中
我的查询/筛选检查,如果submissionID的每个报表对象都有一个submissionID(会计对象存在)。没有一个明确的答案,在实践中,如果它的工作和运行速度足以满足您的需要,那么您可以保持原样。优化永远是你可以回头做的事情 正确连接 如果只是检查联接表是否存在,并且只包含该联接的结果,则可以通过正确的左/右联接表达式来执行此操作。这总是第一个电话 表现力 使用SQL时也要尽可能地表达,如果您想给它提供优化查询的最佳机会,例如,存在诸如EXISTS之类的关键字,请确保使用它们 非规范化 您可以在存储计算值的列中添加,由此产生的复杂性是确保值始终是最新的。这可以通过触发器或手动完成。优点:
- 这是绕过计算列引入的慢度的最简单方法
- 破坏了你的标准化模式
- 如果在代码中手动执行,您将忘记在某个地方执行,这会导致头痛
- 触发器可能有点痛苦
- 使脏的非规范化内容远离您良好的规范化模式
- 不支持物化视图,因此需要进行设置
- 如果在代码中触发视图的刷新,则会得到过时的数据,但不会像反规范化的单列过时那样痛苦
- 触发器可能有点痛苦
此外,如果您觉得数据库信息过于暴露于代码中,您可能希望将其抽象到视图后面 使用视图或(甚至)物化视图怎么样?如果我们能看到SQL语句和/或模式,我们可以帮助您@YohanesGultom+1表示物化视图。。。通常情况下,这类问题的答案是。@StuartWakefield:问题被标记了,这是。@eggyal开箱即用,我同意,尽管在实践中你仍然可以实现物化视图。我在上面的帖子中添加了我的表结构。希望这有助于//编辑:更新了结构,会计对象中的小错误谢谢你的回答!目前,性能并不重要,不会有那么多用户同时使用该系统。我只是想知道这里的好习惯是什么。如果我将查询保持原样,那么If将以稍微定制的方式在我的项目中位于3-4个位置(计算分页的筛选对象、查询筛选对象、带筛选的高级搜索等)。这意味着,如果我做了任何更改,我必须确保所有查询都已更新。正如我在第一篇文章中所说的,表的结构相当复杂,所以维护并不是那么容易。谢谢你添加了赞成和反对意见。非规范化是我一直在寻找的关键词。我想我会去去规范化这些东西。在我的情况下,这将比维持美国的稳定更为痛苦