【问题标题】:PHP/DB pattern questionPHP/DB 模式问题
【发布时间】:2009-12-10 10:11:30
【问题描述】:

我有一个使用“兑换码”概念的应用程序(架构: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 循环创建的表的正确行上?

(我对代码很好,所以我不需要一个工作/很好的语法示例,只是对可能适合这个问题的模式的解释,也许是对类似这样的通用设计的讨论。我是右以避免存储可生成的数据,如使用次数左?等)

【问题讨论】:

  • 等一下。你刚才是说你在 view 中有那个代码吗?
  • 请放心,这实际上是我的模型和视图的精简版。我使用 CodeIgniter,事情被很好地分开了。不过感谢您的关注,如果这一切都在“视图”中,我也会担心。
  • 哦,很好。谢谢,你拯救了我的夜晚;)

标签: php mysql design-patterns architecture


【解决方案1】:

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

是的,不存储计算值是正确的。
计算逻辑可能会发生变化,并且使用存储的计算值进行逆向工程可能是一场噩梦 - 如果在某些情况下可能的话。

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

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

【讨论】:

    【解决方案2】:

    当您运行查询以获取页面代码时,添加子查询以从 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 作为外键而不是代码。

    这一切都假设我正确地阅读了你的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多