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