在数据库中存储整数数组(为了高效选择)

5 mysql normalization

我正在创建一个将存储 100.000(将来可能会更多)用户的数据库。虽然这显然发生在每个用户 1 行的表中,但每个用户都可以(并且将)存储数百个项目。在编程语言中,这意味着用户有 2 个整数数组(或一个二维数组):一列用于 itemid,一列用于金额。

我的直觉告诉我创建一个表来保存所有这些项目,行如 (userid, itemid, amount)。然而,这将导致一个巨大的表。200.000 个用户,每个用户有 250 个项目……一张表中有 5000 万个条目。这一点,再加上桌子会持续快速变化,这让我感到害怕。(有多快?我估计每秒最多可进行 100 次修改。)

通常有 100 到 2000 个用户,所有用户都添加和删除项目,并修改数量。这些操作可以并且将会在编程代码中发生。它将如下进行:

  • 用户启动会话,程序从数据库中加载所有用户项目
  • 用户修改项目列表
  • 每隔几分钟,更改就会保存到数据库中
  • 当用户结束会话时,它也被保存到数据库中

值得注意的是,用户可以存储的项目数量是有上限的。

除了使用单独的表格,还有其他选择吗?也许将值保存在格式化的文本字符串中?或者这是使用 MySQL 数据库实际上是一个坏主意™的实例之一?

感谢您的时间和见解。

Sta*_*hns 6

建立 RDBM 是为了处理这些类型的关系和操作。另外,分别存储用户和项目将有助于详细报告(例如:今天添加的项目数量)。

使用优化的索引,读取每个用户的许多项目只需一次查找。项目表可以被索引以连续存储相关项目(每个用户),从而提供类似阅读场景的数组。只需确保使用页面填充以允许将来的更新/插入/删除。

RDBM 非常快,每秒可以处理十万次操作,所以这可能不是问题。当您的项目位于不同的表上时,与将项目存储在与用户相同的行中的文本列(作为数组)中的情况相比,对每个项目进行的更新的性能更好。这将为您提供更快的更新、更少的操作所需的内存、更快的锁定和释放(并且您可能不必锁定各自的用户)、更小的读/写等......


小智 3

将这些项目保留为单独的表。您需要对许多并发会话进行快速响应。如果使用 Oracle,您可以制作一个不错的 IMDB 缓存场景。在这种情况下,您可以在连接时为用户预加载缓存,从而使内存中高频更新的行可用。要使用此功能,您确实需要 Oracle 11gR2。请参阅Oracle 内存数据库缓存它为您提供了一个非常可扩展的解决方案。响应时间可以是亚毫秒级。