【问题标题】:Inventory Database Design库存数据库设计
【发布时间】:2011-11-15 01:21:30
【问题描述】:

我对使用 MySQL 还很陌生,我正在尝试了解在我的数据库中存储玩家库存物品的最有效方法是什么。

设置如下:

有一个名为'player'的表格,每个玩家都被分配了一个唯一的'playerid',它被设置为表格的主索引。

每个玩家的库存中最多可以有 24 件物品,这些物品的信息存储在一个名为 'player_inventory' 的表中。该表有以下字段:

playerid、slotid、uid、堆栈、用途、耐用性

'uid'是物品的id,'stack''uses''durability' 只是每个项目需要的值(例如,不同插槽中的相同类型的项目可能具有较低的'durability')。

问题是,我无法在库存表中的 'playerid' 上设置索引,因为每个玩家最多有 24 个插槽条目,并且没有其他字段可以保证是唯一的.

所以我担心当这个表有 10000 个玩家的库存时,当我去查询它时,这个表中可能有 240,000 个没有索引的条目 - 有什么告诉我这可能很慢?

我对如何优化我的数据库知之甚少,非常欢迎任何建议。

【问题讨论】:

    标签: mysql database-optimization


    【解决方案1】:

    索引(包括主键的唯一索引)可以定义在多个列上。

    ALTER TABLE player_inventory ADD PRIMARY KEY (playerid, slotid);
    

    这意味着这两列中的值的组合必须是唯一的。但是给定的 playerid 可能出现在多行上,给定的 slotid 可能出现在多行上。

    【讨论】:

    • 啊,听起来很有用。我去看看。
    【解决方案2】:

    最好有 3 张桌子。

    1. tblPlayer(idPlayer INT PK NOT NULL AUTO_INCREMENT, 用户名, 密码等...)
    2. tblItemInventory(idItemInventory INT PK NOT NULL AUTO_INCREMENT, idPlayer FK, idItem FK, ..)
    3. tblItem (idItem INT PK NOT NULL AUTO_INCREMENT, Durability, Uses, )

    tblItem 最多有 24 个 (idItem=24)

    【讨论】:

      【解决方案3】:

      为像库存这样的表设置索引有两种思路。一个涉及提出代理键,基本上是表的自动递增索引,与您的应用程序数据无关。它只是用作索引。

      您可以强制使用索引的另一种方法是使用 playerid 和 uid 的组合。虽然如果一个玩家可以拥有多个相同物品的堆栈(例如在 Diabo 或 MMO 中),您可能可以使用 playerid 和 slotid 的组合作为索引。在 MySQL 中,您可以拥有一个由多个键组成的复合键。

      【讨论】:

      • 玩家可以在多个插槽中拥有具有相同 'uid' 的项目,因此后者将无法工作。如果我使用自动递增索引,我是否必须在查询中使用该字段才能获得索引的好处,还是仅仅通过索引就可以帮助?
      • 如果他们可以在同一个库存中拥有相同的 uid,那么 playerid 和 slotid 的复合键是否有效?如果您使用自动递增字段作为您的 PK,如果您使用它,它将加快查询速度。它也可能有助于数据的底层组织,但我不确定。
      • 复合键是否像上面建议的比尔卡尔文?如果是这样,这听起来像是前进的方向。
      • 是的。它是一个包含两个以上字段的键。
      猜你喜欢
      • 2011-09-30
      • 2010-09-22
      • 2013-09-25
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多