【问题标题】:CQL - Uniqueness of elements in a set of user defined typesCQL - 一组用户定义类型中元素的唯一性
【发布时间】:2016-05-05 07:34:48
【问题描述】:

C* 集合保证集合中的所有元素都是唯一的。它如何用于用户定义类型 (UDT)?

对于简单类型,单元格名称只是与列值连接的 CQL 列的名称。例如,如果我们有

CREATE TABLE friendsets (
        ... user text PRIMARY KEY,
        ... friends set <text>
        ... );

我们的朋友被存储为

(column=friends:'doug', value=)
(column=friends:'jon', value=)

如果朋友被定义为一组UTD(朋友集)怎么办?单元格“朋友”的名称会与 Friend 的序列化值连接吗?

【问题讨论】:

    标签: cassandra cql3


    【解决方案1】:

    当您将冻结类型的值保存到表中时,Cassandra 会将其序列化为 BLOB。磁盘上的表示形式应该与您的集合的任何其他类型相同,但是一旦被查询读取,Cassandra 将能够将字节反序列化为 UDT 实例。

    【讨论】:

    • 那么如何在一组 UDT 中强制执行唯一性?如果朋友有一个 id 和 name,这基本上意味着我可以存储多个具有相同 id 的朋友...UTD 本质上被视为一个元组 - 只有当所有字段都相同时,2 个元组才相等
    • 另外,如何更新朋友的姓名?通过 id 找到好友,将其删除,然后插入新好友?
    • 正确,您必须删除更新的朋友并将其重新添加到您的集合中。对于它的价值,您还必须牢记并发更新。您应该始终使用单独的 CQL 语句来删除或添加元素到集合,而不是替换整个集合,以避免覆盖来自并发更新的更改。
    • 谢谢。并发和读后写仍然是 UTD 的问题 - 如果线程尝试更新同一个 UDT 对象,仍然有可能覆盖更改。
    • 我想我需要 LWT
    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2015-10-19
    • 2018-05-08
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多