我希望在数据库中存储一个排序列表。我想有效地执行以下操作。
我能想到的简单方法是在表中存储某种“等级”属性,并通过对该属性进行排序来进行查询。但是在这种方法中,插入/修改具有等级的记录成为一项代价高昂的操作。有没有更好的方法?
具体来说,我希望使用 Amazon 的 SimpleDB 来实现该表。但是关系数据库的一般答案也应该有帮助。
负载配置文件更新:
由于我正在为 Web 应用程序规划此功能,因此这取决于使用该应用程序的用户数量。
如果有 100k 活跃用户(超级乐观:P),那么我每天非常近似的估计是
500k 次选择,100k 次插入和删除,500k 次更新
我希望该表总共增长到 500k。
我希望优化更新、插入和比较操作。项目的排名会不断变化,我需要保持表格更新。
Nic*_*mas 22
如果排名不是完全任意的,而是可以从其他一些属性(例如姓名、玩家得分等)推导出来,那么请仔细看看乔尔的回答。
如果它是数据的任意属性,则应将其存储为记录表中的列。假设 Amazon 的 SimpleDB 类似于典型的 RDBMS,那么您可以索引此列并使用适当的索引策略快速满足上述所有查询。这对于 RDBMS 来说是正常的。
鉴于您期望高插入和更新活动,但也有相对高的读取活动,我建议执行以下操作:
INCLUDE-ing 排名,或者如果您已在排名上聚集,则仅记录)将满足查询 7。FILLFACTOR在 SQL Server 中设置)。如果您按等级进行聚类,这一点尤其重要。如果您希望在 100K+ 大小的表上读取 100K+,我不建议使用链表方法。它不会很好地扩展到这些尺寸。
bpa*_*lla 14
我通常使用您描述的“排名”方法。当项目需要重新排序时,我经常能够避免删除列表中的所有记录并以正确的顺序重新插入新项目,而不是在更新行时搞砸。该方法明显针对检索进行了优化。
另一种方法是通过使用表上的“前身”自反外键列将记录建模为链接列表:
ID setID item predecessor
--- ------ ------ ------------
1 1 Apple null
2 1 Orange 1
3 2 Cucumber null
4 1 Pear 2
5 1 Grape 4
6 2 Carrot 3
Run Code Online (Sandbox Code Playgroud)
您可以轻松地检索列表并以很少的开销添加和删除项目,但以正确的顺序获取记录将是棘手的。也许有一种聪明的方法可以在单个查询中做到这一点,可能有很多别名表连接。
当我对树型关系(类别、文件夹、集合和子集)进行建模时,我经常使用后一种方法。我通常有某种递归函数来重建我的应用程序中的完整树。
我认为要做的事情是存储用于计算排名的一个或多个属性,然后在它们上建立一个索引。与其试图强制数据库按排序顺序物理存储数据或使用手动管理的链表,为什么不让数据库引擎做它设计要做的事情呢?