2010-11-13 70 views
0

我正在使用Ruby on Rails,并且有一种情况是我想知道是否适合使用某种键值存储而不是MySQL。我有用户有has_many列表和每个列表has_many单词。有些列表有数百个单词,我希望用户能够复制列表。这是一个沉重的MySQL任务b/c它将一次创建这些数百个字对象。使用多个键值存储

作为一种替代方案,我正在考虑使用某种键值存储,其中键只是单词。单词列表可以存储在mysql的文本字段中。每个列表可能是一个新的键值db?似乎以这种方式复制键值db会更快,而不是必须通过数据库。一般来说,这似乎也可能会更快。思考?

回答

1

使用关系数据库来解决这个问题的一般方法是创建一个列表,一个单词表和一个关联这两者的表单词表。你是正确的,会有一些开销,但不要高估它;由于表结构已定义,因此每条记录的实际存储开销非常小,并且可以非常快地插入记录。

如果您想要非常快的副本,您可以允许列表在写入时复制。意味着单个列表可以由多个用户引用,或者由同一个用户多次引用。当用户尝试添加,删除或更改条目时,您只能真正复制列表。当然,这是过早的优化,从简单开始,只会增加像这样的复杂情况,如果你发现它们是必要的。

您可以按照您的建议使用键值存储。我会避免试图在MySQL文本字段之上构建一个,因为它有一个很好的理由,它会使按键搜索非常缓慢,因为它需要字符串搜索。像CouchDB或东京内阁这样的键值数据存储可以很好地完成这项工作,但它很可能会占用更多的空间(因为每个记录都必须定义自己的结构,并且每个单词都必须在每个列表中单独记录)。性能的唯一维度我认为会更好的是,如果您需要大规模的可扩展读写,但这只与最大的系统有关。

我会天真地使用MySQL,只有在需要性能的情况下才能进行更改,并且可以证明此方法实际上会更快。

+0

非常感谢扎克。这是非常丰富的。我想知道,为什么最好使用列表单词表?为什么不在每个单词对象中放一个list_id,然后has_many:List中的单词? – TenJack 2010-11-13 07:08:14

+0

第二个问题:我假设在字符串上使用正则表达式会比数据库查询更快。例如,我可以使用gsub通过用空字符串替换单词来查找和删除单词。这不是一个有效的假设吗? – TenJack 2010-11-13 07:10:14

+0

@TenJack - 对于你的第一个问题:我假设有一个单词数量有限,就像在一个标签系统中一样。当然,由于一种语言中只有这么多的单词,单词的数量是有限的。如果单词数量少于列表条目和/或您对单词进行索引或查询感兴趣,则使用列表单词表。如果列表之间的通用词很少,那么多对一会很好。 – 2010-11-13 08:34:31