我有用户模型对象,其中包含很少的字段(属性,如果愿意)。说“名”,“姓”,“城市”和“出生年份”。每个用户也获得“唯一的ID”。使用HBase和/或Cassandra进行搜索(和一般查询)(最佳实践?)
我希望能够通过它们进行搜索。我如何正确地做到这一点?如何做到这一点?
我的理解(将用于几乎任何工作键值存储 - 首先进入键,然后值)
U:123456789 = serialized_json_object
(“U”作为一个简单的前缀为用户的密钥,123456789是“唯一ID”)。现在
,以为我希望能够通过名字和姓氏进行搜索,我可以节省:
F:史蒂夫= U:384734807,U:2398248764,U:23276263 F:亚历克斯= U :12324355,u:121324334
so key is“f” - 这是名字的前缀,“Steve”是实际的名字。 对于“u:Steve”,我们将所有用户标识的值都保存为“Steve's”。
这使得每个搜索都非常简单。通过名字(即“Steve”)和姓氏(即“l:Anything”)查询几个字段(属性)仍然很容易 - 首先从“f:Steve”获取用户id列表,然后从“l :任何事情“,找到穿越用户ID,一个你在这里。
问题(也有不少):
保存,更新,删除用户是一种痛苦。它必须是原子和一致的操作。另外,如果我们的价值大小限于某个价值 - 那么我们处于(潜在的)麻烦之中。这里真的没有答案。仅压缩用户标识列表?虽然不太酷。
什么我们要添加新的字段来搜索。最终。按“城市”说。我们当然可以用同样的方式“c:洛杉矶”= ...,“c:芝加哥”= ...,但如果我们从一开始就没有预见到所有这些“搜索选择”,那么我们将会有能够创造一些夜间工作或一些去所有现有的用户记录和更新这些“C:城市”为他们......很大的工作!
锁定问题。用户“u:123”更新他的名字“Alex”,用户“u:456”更新他的名字“Alex”。他们都必须用他们的身份证更新“f:Alex”。这意味着要么我们进入覆盖问题,要么一个更新会等待另一个更新(并且如果它们中有很多是成像?!)。
这样做的最好方法是什么?请记住,我想通过很多领域进行搜索?
P.S.请问,这个问题是关于HBase/Cassandra/NoSQL/Key-Value存储的。请请 - 没有建议使用MySQL和“阅读”选择;并担心“稍后”出现缩放问题。我之所以会问我这个问题,是有原因的。 :-)
您能否提出实现Cassandra/HBase的描述功能的最佳方法?我的“自己”方式只是我的猜测,我想知道的是,这里的最佳做法是什么。 – alexeypro 2010-04-12 15:16:07
所有这些都对真实的最佳实践来说有点新,但是您描述的方法与标准相当接近。您需要的主要改进是使用您选择的平台为列表提供的任何支持,以便您可以添加项目而无需加载整个列表。有了Cassandra,你可能会使用超级列。如果您有像memcached这样的纯键 - 值存储,则可以将列表实现为值,但是您还需要实现锁和可能的队列。 – 2010-04-13 07:05:30