2010-07-23 38 views
2

我正在为PenWag.com进行从MySQL到Cassandra的转换。在Cassandra中,我将存储的用户从GUID中删除,但用户使用他们的电子邮件登录,而不是GUID(显然)。出于两个原因,GUID作为用户的关键字对我来说比电子邮件更有意义。从实际角度来看,使用SuperColumns更改或删除/添加行非常麻烦。从理论的角度来看,它仍然是一个用户,为什么他们的关键应该改变?Cassandra/BigTable数据模型 - 构建索引的最佳方法是什么?

尽管如此,我的问题是:我在一个单独的ColumnFamily中创建索引,将email-> GUID映射为支持登录。这是一个标准类型的CF,其中列名是电子邮件,值是GUID。它是标准的,而不是超级的,以避免为每个映射加载整个SC。支持“更改电子邮件”很容易,它只是一个列删除/添加。但是,似乎替代方法是将索引存储为行而不是列,其中行键是电子邮件,而列存储GUID。删除/添加这些行将不会很麻烦,因为只有列(GUID)需要管理。

看来这两种方法都有效。每个的优缺点是什么?有最佳做法吗?

回答

2

因为我没有动手与卡桑德拉或类似数据库的经验,你需要把我的答案盐:)

一粒如果要存储每个映射为一列,用电子邮件地址作为列名,这意味着包含大量列的单行。根据维基百科[1]

下单排键每个操作是每个副本原子不管多少列被读取或写入。

这可能会导致显著锁定开销,如果所有映射存储在单行中。

卡桑德拉维基指出[2]

行密钥是什么决定什么机器数据存储在。

这让我相信基于行键进行查找比在列名上进行查找更有效。根据这些信息,我建议使用电子邮件地址作为行密钥并将GUID存储在列中。

+0

我也将使用他们的电子邮件地址作为键和GUID作为列。所以你有一列和许多行。这样数据可以在整个集群中传播。 – Zanson 2010-08-07 23:19:43

相关问题