mysql db结构和关系

时间:2012-08-12 13:45:52

标签: php mysql relationship

我需要有关如何在我的mysql数据库中设置表的帮助。

我有一个用户。用户可以根据需要获得10个令牌。令牌只能用于一件事。他们可以使用它来创建卡通页面,游戏页面,生物页面,问题页面等。令牌也可以重新分配到另一个页面。

我想知道构建数据库的最佳方式是什么以及关系。

我正在考虑使用用户表,令牌表,卡通表,游戏表,生物表和问题表。但是我如何与所有这些相关。

1 个答案:

答案 0 :(得分:0)

关系数据库表设计不是一门硬科学。它是一种高度灵活的范例,可以并且将根据应用程序的性质而改变。话虽如此,您通常应遵循某些设计原则。参见例如http://en.wikipedia.org/wiki/Database_design

话虽这么说,我会从一个看似高度动态的方法中尝试一下,因为我不确定具体的应用程序。首先,您肯定需要一个users表,看起来像:

用户:

  • 如first_name
  • 姓氏
  • USER_ID
  • n_tokens
    • 我把它放在这里,以防用户的令牌数量是动态的

现在您已经有了指定用户的方法,您将希望了解该用户如何使用他/她的令牌:

标记:

  • token_id
    • 这用于指定此(或这些)令牌的用途。
  • USER_ID
    • 这应该对users.user_id具有重复的外键约束。
  • n_tokens
    • 这与users.n_tokens不同。你的问题并不清楚 是否每个功能总是有1个令牌。这个值是 在未来可能的改进方面具有前瞻性的方法。
  • pagetype_id
    • 这是指定令牌用于哪种类型的页面类型。它会有 pagetypes.pagetype_id上​​的外键约束(见下文)。

如上所述,您希望人们在特定页面类型上使用令牌,例如本表定义的卡通页面,生物页面等:

pagetypes:

  • pagetype_id
    • 用于为此类页面定义唯一标识符
  • pagetype_name
    • 用于标记页面类型的字符串字段,例如“卡通”,“生物”等。

现在,您可能有几个表定义页面类型,所以我只指定一个布局:

bio_pages:

  • pagetype_id
    • 此id在pagetypes.pagetype_id上​​有一个重复的外键约束。 对于此表,该值始终是常量。这不是最多的 标准化设计,因为您可能希望拥有更通用的“页面”表, 但是一些复杂的连接可能会让一些开发人员感到困惑甚至 更糟糕的是,查询速度慢。
  • token_id
    • tokens.token_id的外键约束。
  • OTHER
    • 其他字段是用户定义的,因为您希望指定内容 属于生物页面。

概要

总结上面的表格布局,您需要设计数据库,以便自包含实体不跨越多个表,并且多个实体不会合并为一个表。话虽如此,我从users表中分离出来自不同tokens表的<pagetype>_pages表。为了使设计更直观,我将做一些可能有助于您理解布局的示例查询。

  1. 获取用户创建的所有生物页面:

    SELECT    bio_pages.*
    FROM      bio_pages
    INNER
    JOIN      tokens
        ON    bio_pages.token_id=tokens.token_id
    INNER
    JOIN      users
        ON    tokens.user_id=users.user_id
    WHERE     users.first_name='john'
        AND   users.last_name='doe'
    
  2. 获取用户使用过的硬币总数,以及他们可以使用的最大硬币数量:

    SELECT    SUM(tokens.n_tokens) AS used_tokens,
              users.n_tokens       AS max_tokens
    FROM      tokens
    INNER
    JOIN      users
        ON    tokens.user_id=users.user_id
    WHERE     users.first_name='john'
        AND   users.last_name='doe'
    GROUP BY  users.user_id
    
  3. 希望这一切都有意义且直观。如果有任何不清楚的地方,请告诉我。