在数据库中存储整数数组

Rap*_*sey 2 sql database performance

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

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

通常会有100到2000个用户,包括添加和删除项目以及修改金额.这些操作可以并且将在编程代码中发生.它将如下:

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

值得注意的是,用户可以存储的项目数量最多.

有没有其他方法可以使用单独的表格?也许将值保存在格式化的文本字符串中?或者这是使用MySQL数据库实际上是一个坏主意™的实例之一?

感谢您的时间和见解.

sym*_*ean 5

我的直觉告诉我要创建一个表来容纳所有这些项目

你的直觉是正确的.

1)避免过早优化

2)除非你有一个非常好的和真实的理由,否则不要违反规范化规则

3)为什么你怀疑多表方法会更快?

这是一张表中的5000万条目

所以呢?即使您只有userid索引,与每个用户的单个表相比,性能差异也不会明显变慢(实际上,有200,000个用户,它会更快,更快 - 因为DBMS可以轻松地保持开放状态每个表的文件句柄!).

我估计每秒最多100次修改

应该可以使用MySQL和相当基本的硬件,但如果它是我,我想要一点空间,我会选择一对镜像SATA磁盘,一个镜像表,另一个镜像索引.

我唯一关心的问题(无论你选择哪两个模型都适用)都支持2000个并发连接.连接必须是并发的吗?或者每个用户是否可以下载工作集(可选择使用乐观锁定策略)并关闭连接,然后在新连接上推回更改?如果没有,那么你可能想要一个良好的内存和CPU重击.

但是,不管是使用一个大表还是许多小表,如果这是数据的唯一用途,并且访问不是与特定数据项并发,那么为什么还要使用关系数据库呢?NoSQL或共享文件系统也可以正常工作.