1

这个问题是关于性能的,而不是关于可能的解决方案。

我的系统包含许多不同类别的项目。每个类别都有自己的表,因为每个表都有很多行并且字段不同。

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,预计会随着更多用户的加入而变得更大。

我知道最好的办法是测试这两种方法的性能并做出决定,但事实是,转向多表设计不会那么快和那么轻松。

如果您有类似问题的个人经验,请分享。

谢谢

4

2 回答 2

4

规范化数据库通常对性能和可维护性更好。

这种方法将创建一个Items与 ItemA、ItemB 等具有 1:1 关系的表。然后您可以创建一个Inventory与基表具有关系的Items表。

根据文档,InnoDB 支持行级锁,因此无需使用多个表来防止死锁。

于 2009-12-04T22:50:15.703 回答
1

这是我对这个故事的看法,希望这能有所帮助。

  • 项目表具有所有项目共有的字段。
  • 类别(A、B、C)表具有特定于每个表的字段。
  • 一个用户有很多项目,一个项目可以被多个用户使用。

    库存模型_01
于 2009-12-04T23:09:53.760 回答