代码之家  ›  专栏  ›  技术社区  ›  Alex Mcp

php/db模式问题

  •  0
  • Alex Mcp  · 技术社区  · 15 年前

    我有一个应用程序可以处理“赎回代码”(模式: 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 )这部分工作得很好,但问题是:

    看法 在我管理代码的页面上,我有基本的设置(在伪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 回复  |  直到 15 年前
        1
  •  0
  •   OMG Ponies    15 年前

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

    是的,不存储计算值是正确的。
    计算逻辑可以改变,使用存储的计算值进行反向工程可能是一场噩梦——如果在某些情况下可能的话。

    听起来您希望将这两个查询组合在一起:

    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
  •  0
  •   Galen    15 年前

    当您运行查询以获取该页的代码时,添加一个子查询以从条目_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使用代码\U ID作为外键,而不是代码。

    这都是假设我正确地理解了你的问题