使用函数/对象和数据库时的最佳实践 - 一般问题

时间:2010-10-16 08:07:02

标签: php mysql asp-classic

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要在您网站的多个位置执行相同处理的内容。这是一个功能。所以你绝对需要一个函数(或者如果你使用OOP的方法)。

为避免多次运行同一查询,您可以实现一些简单的脚本缓存。我将假设内存不会成为问题,您不需要在同一个脚本执行中为数千个用户运行该函数。如果我错了,请纠正我。

要实现该缓存,请在该函数中保留一个静态成员,该成员将扮演缓存仓库的角色。一个数组,其中键是用户ID。在每次调用时,如果这是第一次为该ID调用该函数,请执行查询,然后添加到缓存中。如果没有直接从缓存中获得结果。

function getData($id){
    static $cache = array();
    if(!isset($cache[$id])){
        $cache[$id] = /* get the data */
    }

    /* do any processing or output with data from $cache[$id] */   
}

您需要做的是基本上修改原始函数并将其输出缓存为某些输入值。为了能够缓存某些东西,你需要在函数调用之间保留的东西。那将是一个静态变量。如果您对静态变量的工作方式不满意,也可以使用全局变量。

答案 1 :(得分:0)

虽然我不确定我是否正确处理了你所提出的问题的所有方面,但我认为这实际上是关于两个问题:

1st:尽量减少数据库访问 第二:最大限度地减少扩展用户(或任何模型)对象结构的维护开销。

Alin正确地回答了第一点(我不是PHP专家),在其他应用程序服务器环境中,我会推荐类似的模式(例如Java中的单例类)。

现在第二点:要不在所有地方维护所有模型属性的列表,一种可能的方法是通过将属性的元信息存储在数据库中来对结构进行去规范化。例如,要有一个与用户表具有n:1关系的第二个表,如(伪SQL):

CREATE user_attribs (
  id INTEGER NOT NULL PRIMARY KEY, -- artifical key
  user_id INTEGER NOT BULL FOREIGN KEY (users, id), -- referencing users table
  key CHAR(<approriate length>) NOT NULL, -- the name of the attribute
  value TEXT, -- the attribute's contents
);

然后,您将通过发出以下内容构建所有用户属性的集合:

SELECT key, value FROM user_attribs WHERE user_id = <actual user_id>;

或者在join子句中一起查询它们,并将它们放在类似字典的结构中,如HashMap,Map,Dictionary或者您选择的程序语言。对于每个页面,您只能访问每个用户所需的字典条目。

但是这种方法有一个严重的缺点:因为你的属性是由字符串引用的,所以没有解释器/编译器自动警告你试图访问不存在的属性,或者存储一些你不会再找不到的属性,因为e 。 G。你在一个模块中写了“birthday”,在另一个模块中写了“day_of_birth”。所以它需要相当多的自律和文档。