这个问题是关于性能的,而不是关于可能的解决方案。
我的系统包含许多不同类别的项目。每个类别都有自己的表,因为每个表都有很多行并且字段不同。
ItemA - id, fld1, fld2
ItemB - id, fld1, fld3, fld4
ItemC - id, fld1, fld3, fld5
....
现在需要管理用户库存,这意味着用户是否有物品。一种选择是使用单个表:
Inventory - category_id, item_id, user_id
对于 ItemA、ItemB、... 行,category_id 是不同的,这就是我们区分的方式。
第二种选择是:
InventoryA - item_id, user_id
InventoryB - item_id, user_id
...
第一个选项可能是最容易管理的,但是库存表很大(数量级:所有类别的项目数乘以用户数)并且经常更新和经常查询。
第二个选项会有点难以管理(因为我们为每个类别创建了一个新的库存表),但可能会带来性能提升,因为它可能会阻止竞争条件。由于类别是完全隔离的,因此没有一个查询可能需要涉及一个以上的清单表。
目前系统使用 MySQL 和 InnoDB 引擎。大约有 10 个类别,但预计在不久的将来会增长到几十个。最大的类别有 > 200k 个项目,大多数有 > 10k 个项目。单个库存表的行数超过 10M,预计会随着更多用户的加入而变得更大。
我知道最好的办法是测试这两种方法的性能并做出决定,但事实是,转向多表设计不会那么快和那么轻松。
如果您有类似问题的个人经验,请分享。
谢谢