【发布时间】:2009-06-25 10:43:20
【问题描述】:
我在 MySQL 数据库中存储了数百万个项目的有序列表。合理地经常需要从列表中添加或删除项目;同样,必须确定项目在列表中的位置。我会说读/写比率约为50:50。
从链表模型开始,我阅读了 [1] 以及那里讨论的各种模型。对于严格的链表,邻接表模型可以正常工作,但由于读/写比率或多或少相等,我采用了使用标准连续列表的分而治之的方法:
将整个列表划分为近似长度的“桶”(例如~10000),维护桶大小的索引及其在主列表中的相对位置。每个项目都分配给特定的存储桶并跟踪其在该存储桶中的位置。
使用这种方法,项目的位置是通过将列表中位于该项目的存储桶之前的存储桶的大小相加,然后将该项目的位置添加到其自己的存储桶中来确定的。要从列表中插入/删除项目,所产生的项目的“移动”被本地化到正在添加或删除项目的桶中;该存储桶的大小也必须相应更新。
这种方法存在一些非规范化(存储桶大小),它本质上不是线程安全的,即使对于事务也是如此,因为在删除/插入期间,必须查询项目表以确定项目的存储桶位置被修改,然后更新以对该项目的存储桶中的所有其他项目执行“转移”。除非这些操作是原子的(可能是通过存储过程?),否则线程会一直死锁。
有没有更合适的方法将此类数据保存在 RDBMS 中?线程安全问题让我很头疼,感觉应该有比强迫我使用存储过程更好的方法来解决这个问题。
非常感谢, 马特。
【问题讨论】:
标签: mysql database-design data-structures html-lists