数据库支持一对多反向查找

时间:2015-04-02 18:17:23

标签: database one-to-many key-value-store nosql

我正在寻找一个数据库系统(我认为是NoSQL系统)来存储用户ID和别名映射。

每个用户ID可能与多个别名相关联,我需要能够从两种方式快速查找。 (即通过别名搜索用户ID,并按用户ID搜索别名)。每个别名也可能包含一些元数据。另请注意,我们最多可能有数百万用户ID。

考虑到我们拥有的用户ID数量,我不确定使用RDBMS是否是个好主意,例如MySQL。虽然MySQL不能完全符合我的目的,但如果它不适合我们的用户数量。

这是我到目前为止所考虑的数据库系统。

  • Redis ,我们可以将所有用户ID作为集存储到redis中,使用用户ID作为密钥,以及集合中用户的所有别名。然后将所有别名存储为哈希,使用别名作为键,用户ID和元数据作为值。 userID1 => [alias1, alias2, alias3] alias1 => {user:userID1, meta: metadata} alias2 => {user:userID1, meta: metadata} alias3 => {user:userID1, meta: metadata}

Redis很快,但它是内存存储。这意味着它的容量受到服务器上可用内存量的限制。如果我们使用此解决方案,我们需要将密钥分成多个Redis实例。

  • HBase 旨在存储数十亿条记录,HBase支持随机访问。此外,我们已经在生产中拥有一个Hadoop集群。我们可以将用户ID用作行键,并具有别名和元数据的列族。但HBase并不是真正用于时尚存储的键值对。但是,如果我们不设置单独的反向查找记录,我们就无法有效地找到与别名相关联的用户ID,例如在Redis中。

  • Apache Cassandra 。从2.1版开始,Cassandra支持索引集合。我以为我可以使用用户ID作为主键,并将所有别名放在集合中(例如设置),并为集合编制索引。但后来我读了this文章解释了为什么不建议在高基数列上使用索引。这意味着在集合上创建索引并不是一个好主意,因为我们的系统中可能没有两个相同的别名。

提前致谢。

0 个答案:

没有答案
相关问题