PHP / DB模式问题

时间:2009-12-09 22:01:11

标签: php mysql design-patterns architecture

我有一个适用于“兑换代码”(架构:ID, NAME, USES, CODE)的应用程序。例如"32, Stack Overflow, 75, 75%67-15hyh"

所以这个代码是给SO社区的,比方说,它有75个兑换。您可以通过输入一些运输信息和代码来兑换它。输入后,将执行此检查:

if (code exists){
    if (count_entries_where_code=$code < $uses_set_at_creation){
        //enter information into DB for processing
    {
    //echo "sorry, not a real code"
}

因此总使用次数是硬编码的,但是当前的兑换次数是使用SQL查询(count_results from entry_data WHERE code=$code)生成的。这部分工作正常,但问题是:

在我管理代码的 view 页面,我有基本设置(在伪PHP中,,实际代码分为MVC设置):

$results = "SELECT * FROM codes";
foreach ($result as $code){
    echo $code->code;
    echo $code->name;
    //etc. It's actually all in a nice HTML table.
}

所以我希望列出一个列表“代码中剩余的使用数量”。这样的东西应该存储在数据库中,并以这种方式绘制出来吗?使用foreach循环生成会更容易,但我通常不喜欢存储“生成的”统计信息。有没有一种聪明的方法可以将这些结果放到使用foreach循环创建的表的正确行上?

(我对代码很好,所以我不需要一个工作/很好的语法示例,只是对可能适合这个问题的模式的解释,也许是对这类事情的常见设计的讨论。我是是否有权避免存储可生成的数据,例如剩余的使用数量等等。)

2 个答案:

答案 0 :(得分:0)

运行查询以获取页面代码时,添加子查询以从entry_data表中获取已使用代码的数量。

select codes.id, codes.name, codes.uses, codes.code (select count(code) from entry_data where entry_data.code=codes.code ) as used_codes

Id使用code_id作为外键而不是代码。

这是假设我正在正确阅读您的问题

答案 1 :(得分:0)

  

我是否正确避免存储可生成数据,例如剩余的使用数量?

是的,你没有存储计算值是正确的 计算逻辑可以改变,并且使用存储的计算值对其进行逆向工程可能是一场噩梦 - 如果在某些情况下完全可能的话。

听起来你想要结合两个查询:

SELECT c.id, 
       c.name, 
       c.uses, 
       c.code,
       x.num_used
  FROM CODES c
  JOIN (SELECT ed.code,
               COUNT(*) 'num_used'
          FROM ENTRY_DATA ed
      GROUP BY ed.code) x ON x.code = c.code