库存数据库设计

时间:2011-09-12 04:59:49

标签: mysql database-optimization

我是使用MySQL的新手,我试图了解在我的数据库中存储玩家库存项目的最有效方法是什么。

所以这是设置:

有一个名为'player'的表格,每个玩家都会被分配一个唯一的'playerid',并将其设置为该表的主要索引。

每个玩家的广告资源中最多可包含24个商品,有关这些商品的信息存储在名为'player_inventory'的表格中。该表包含以下字段:

playerid,slotid,uid,stack,uses,durability

'uid'是商品的ID,'堆叠''使用''耐久性'< / strong>只是每个项目所需的值(例如,不同插槽中的相同类型的项目可能具有较低的'耐久性')。

问题在于,我无法在库存表中的'playerid'上设置索引,因为每个玩家最多有24个插槽条目,并且其他任何字段都不能保证唯一

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

拥有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,)
  4. tblItem最多有24个(idItem = 24)

答案 2 :(得分:0)

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

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