0

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

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

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

我正在考虑有一个用户表、令牌表、卡通表、游戏表、生物表和问题表。但我如何与所有这些联系起来。

4

1 回答 1

0

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

话虽如此,我将通过一种似乎高度动态的方法来解决这个问题,因为我不确定应用程序的细节。首先,您肯定需要一个如下所示的users表格:

用户:

  • 用户身份
  • n_tokens
    • 我把它放在这里以防用户的令牌数量是动态的

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

代币:

  • token_id
    • 这用于指定此(或这些)令牌的用途。
  • 用户身份
    • 这应该对 users.user_id 有一个重复的外键约束。
  • n_tokens
    • 这与 users.n_tokens 不同。从您的问题中不清楚您是否总是每个功能都有 1 个令牌。该值是对未来可能增强的前瞻性方法。
  • pagetype_id
    • 这是为了指定令牌用于什么类型的页面类型。它将对 pagetypes.pagetype_id 有一个外键约束(见下文)。

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

页面类型:

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

现在,您可能有多个表定义页面类型,因此我将只为其中一个指定布局:

生物页面:

  • pagetype_id
    • 这个 id 在 pagetypes.pagetype_id 上有一个重复的外键约束。该表的值将始终保持不变。这不是最规范的设计,因为您可能希望拥有一个更通用的“页面”表,但是一些复杂的连接可能会让一些开发人员感到困惑,更糟糕的是,查询速度很慢。
  • token_id
    • tokens.token_id 上的外键约束。
  • 其他
    • 其余字段是用户定义的,因为您希望指定生物页面上的内容。

概括

总结上述表格布局,您需要设计数据库,使自包含实体不跨越多个表格,多个实体不组合成一个表格。话虽如此,我将表格与不同表格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
    

希望这一切都有意义且直观。如果有任何不清楚的地方,请告诉我。

于 2012-08-12T14:42:02.350 回答