对于我的博客脚本,我设置了一个用户组和权限系统。每个用户都被分配给一个用户组,而我有一长串权限设置。两者都存储在MySQL数据库中。
目前,我对每个页面执行大约10个权限查询,用于各种内容管理功能。再加上另外20多个关于一般博客使用的查询,查询的数量正在增加。
在脚本开始时执行一个查询,将所有权限设置检索到数组中,然后让所有函数比较数组中的值,而不是检查数据库,这样会更有效吗?
发布于 2011-07-15 09:03:54
是的,1查询比X更有效。
您是否考虑过进一步减少查询,只在登录时这样做并将权限存储在会话中?
发布于 2011-07-20 18:56:37
基于@Jonno在这里说的话:一次查询所有设置是否更有效,还是在需要设置时进行查询?
原来的Q是这样的:
对于我的博客脚本,我设置了一个用户组和权限系统。每个用户都被分配给一个用户组,而我有一长串权限设置。两者都存储在MySQL数据库中。目前,我对每个页面执行大约10个权限查询,用于各种内容管理功能。再加上另外20多个关于一般博客使用的查询,查询的数量正在增加。我想知道在脚本开头执行1次查询是否更有效,以便将所有权限设置添加到数组中,然后让所有函数比较数组中的值,而不是检查数据库。意见?
那事实和问题呢?
我可以回答最后一个问题。它是“不,我没有”,我知道这一点,因为如果你有,你会来到这里,“我如何使这个架构更快”。(程序员似乎不喜欢的一件事是,“但你没有先试一试!?!!”)所以在将来要记住这一点。)
如果您和大多数人一样,实际上是通过另一层内容来运行查询,这需要很长的时间(在cpu时间内)才能真正返回结果,并且希望它花费更少的时间。您可以尝试几种方法,例如手动编写查询代码,这将有所帮助,但会减少您已经使用的中间层的帮助。
但在琼诺的回答中,我建议你这样做。为权限创建API。当您更新一个权限时,您将通过这个API执行此操作,API将检查该用户的当前会话,并在找到时进行更新,然后更新数据库。它还跟踪任何如此更改的设置,并在遇到错误时撤消所有操作。Yay事务状态。当然,这种天真的方式只是试图更新和忽略任何错误。
所以我们要用伪码来实现,好吗?
class sessionByUser{
User user
UpdateValue(key,value){
foreach(session in Sessions){
if (session.user == user)
session.key = value
}
db.updateUserKey(key,value) //what you were doing before
}
}您可以看到,我们需要立即实现crud操作的其余部分,但这为用户会话值的实时更新提供了基础。
就像我说的,这完全是伪代码,但是如果你不每次都回到数据库的话,这就是它的方法。FWIW:微软ASP.NET用户数据库每次都会返回到数据库,以检查是否有任何更新。我的系统没有明显的负荷。
此外,此设置也适用于其他全局值。假设您希望拥有一个全局对象存储,用于跟踪其他服务的API键之类的东西,您可以使用这种自定义的概念,即拥有一个带有访问器方法的全局单例。
https://softwareengineering.stackexchange.com/questions/93072
复制相似问题