【发布时间】:2011-02-07 17:56:03
【问题描述】:
如何为庞大的标签系统(如digg或delicious)设计数据存储?
关于它已经有discussion,但它是关于集中式数据库的。由于数据应该会增长,因此我们迟早需要将数据划分为多个分片。那么问题就变成了:如何为分区标注系统设计数据存储?
标签系统基本上有3张表:
Item (item_id, item_content)
Tag (tag_id, tag_title)
TagMapping(map_id, tag_id, item_id)
如果表存储在一个数据库实例中,这对于查找给定标签的所有项目和查找给定项目的所有标签都很好。如果我们需要将数据分区到多个数据库实例中,那就没那么容易了。
对于表Item,我们可以用它的键item_id来划分它的内容。对于表 Tag,我们可以用它的键 tag_id 对它的内容进行分区。例如,我们要将表 Tag 分区为 K 个数据库。我们可以简单地选择数字 (tag_id % K) 数据库来存储给定的标签。
但是,如何对表进行分区TagMapping?
TagMapping 表表示多对多关系。我只能想象有重复。也就是说,TagMappping的相同内容有两个副本。一个用 tag_id 分区,另一个用 item_id 分区。在为给定项目查找标签的场景中,我们使用带有 tag_id 的分区。如果要查找给定标签的项目,我们使用带有 item_id 的分区。
因此,存在数据冗余。并且,应用程序级别应该保持所有表的一致性。看起来很难。
有没有更好的方案来解决这个多对多的分区问题?
【问题讨论】:
标签: database tags tagging partitioning