我最近看过一个比较简单的游戏,大约有10k个玩家.在游戏中,您可以捕捉和养殖具有某些属性(即翅膀,角,鬃毛)的宠物.数据库中目前有一个表格如下所示:
------------------------------------------------------------------------------- | pet_id | wings1 | wings1_hex | wings2 | wings2_hex | horns1 | horns1_hex | ... ------------------------------------------------------------------------------- | 1 | 1 | ffffff | NULL | NULL | 2 | 000000 | ... | 2 | NULL | NULL | NULL | NULL | NULL | NULL | ... | 3 | 2 | ff0000 | 1 | ffffff | 3 | 00ff00 | ... | 4 | NULL | NULL | NULL | NULL | 1 | 0000ff | ... etc...
表格就像这样,目前有100列,但一般来说,一只宠物只有大约1-8个属性.每1-2个月添加一个新属性,这需要添加表列.表很少更新和阅读频繁.
我一直在建议我们转向更垂直的设计方案,以获得更好的灵活性,因为我们希望在将来开始增加更多的属性,例如:
---------------------------------------------------------------- | pet_id | attribute_id | attribute_color | attribute_position | ---------------------------------------------------------------- | 1 | 1 | ffffff | 1 | | 1 | 3 | 000000 | 2 | | 3 | 2 | ffffff | 1 | | 3 | 1 | ff0000 | 2 | | 3 | 3 | 00ff00 | 3 | | 4 | 3 | 0000ff | 1 | etc...
旧的开发人员已经引起了人们的关注,因为用户经常搜索具有特定属性的宠物(即必须具有这些属性,必须至少有一个在该颜色或位置上必须具有> 30个属性),这将产生性能问题.目前搜索是非常快的,因为没有JOINS需要,但引入一个垂直表可能意味着每个搜索的属性的附加连接,也将三行的行数.
我的问题的第一部分是如果有人对此有任何建议?我对数据库设计或优化没有特别的经验.
我已经为各种案例进行了测试,但是它们的确很大程度上没有结果 – 对于我所运行的所有查询(即半秒到20秒),时间差异很大,所以我想我的第二部分问题是,在PHP中使用微时间(true)是否有更可靠的查询时间方法.
谢谢.