【问题标题】:Cassandra Email as primary key? And what exactly is a dynamic column family?Cassandra 电子邮件作为主键?什么是动态列族?
【发布时间】:2014-05-30 16:23:12
【问题描述】:

在 Cassandra 中使用电子邮件作为主键会是不好的做法吗?这是否会导致复制出现问题(因为第一个主键用于复制 - 分区键)?

根据文档,使用高基数“键”作为索引不是一个好主意。它说应该为针对高基数列的查询创建一个动态列族(表)。

如果我在数据库中跟踪的主要内容是使用 EMAIL(到应用程序)登录的 USER 使用其他任何东西,但 EMAIL作为主键..

使用 EMAIL 作为行键是否有效?是否有理由为此使用 UUID?

我(也许是无知地)预见到的问题是,使用 UUID 作为行键,然后将电子邮件添加为另一个主键会失去唯一性(即电子邮件地址的唯一性)。然后可以使用同一个电子邮件创建多个帐户(无需额外检查以确保该电子邮件未被使用——这需要索引还是动态表?)

这就引出了第二个问题。究竟什么是动态表?我没有看到这个高基数键在动态表中使用的位置。现在它是行键吗(为什么不让它作为开始的行键..)?

对行键的搜索是否比创建的索引具有更高的性能?

有人对此有任何见解吗?我真的很感激!

如果动态列族只是意味着列是“动态”添加的,那么我看不出这对高基数列在索引方面有何帮助。

【问题讨论】:

    标签: database-design cassandra database-performance cassandra-2.0 nosql


    【解决方案1】:

    您正在混淆主键和二级索引。基数与效率的权衡适用于二级索引,但不适用于主键。主键值根据定义是唯一的,也是查找和访问单行的最有效方法。看看这个关于indexes in Cassandra的总结。

    使用用户的电子邮件地址作为用户表的主键绝对没有问题,如果这是唯一标识您的用户并将他们与他们的详细信息相关联的方法。

    动态列族是一个“表”,其列数不固定。您不仅可以通过添加行来添加信息,还可以通过动态添加列来添加信息。例如。建立一个时间序列的事件。列族始终是动态的,尽管我认为 CQL 层掩盖了这一事实。是否将其视为这样或作为一组固定的列取决于您。要查找一些理论背景,请查看 BigTable 概念以及 Cassandra 如何实现它。

    【讨论】:

    • 您知道为什么建议为高基数索引创建另一个“动态”表吗?这对我来说没有意义,因为这有什么帮助..我猜这个表的主键这次应该是高基数键? (只是没有说明,但我猜它是隐含的?)如果电子邮件是主要标识符,UUID 会有用吗?
    • @user2243357 如果电子邮件地址是您的用户实体的唯一标识符,那么您也不需要密钥中的 UUID。正如您自己所说,这将使电子邮件地址作为密钥的唯一性无效。
    • @user2243357 我认为动态 CF 的想法是您使用搜索值作为键,并通过添加带有结果值的列来自己维护结果集。例如。您无需在“邮政编码”列上创建二级索引,而是使用邮政编码作为行键,然后为具有该特定邮政编码的用户添加列。
    • 好的,这也是我的想法(对我来说唯一有意义的方法)。谢谢,拉尔夫!
    • 我很担心数据分布。因为电子邮件地址不是非常“唯一”(如 UUID),它们会(在大多数情况下)均匀分布在节点之间吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2014-06-20
    • 2013-09-18
    • 2015-05-12
    • 1970-01-01
    • 2013-12-06
    • 2013-08-27
    • 2011-04-17
    相关资源
    最近更新 更多