Cassandra - 使用 ORDER BY 和 UPDATE 集群键的替代方法

2024-05-24

我的架构是:

CREATE TABLE friends (
     userId timeuuid,
     friendId timeuuid,
     status varchar, 
     ts timeuuid,   
     PRIMARY KEY (userId,friendId)
);

CREATE TABLE friends_by_status (
    userId timeuuid,
    friendId timeuuid,
    status varchar, 
    ts timeuuid,   
    PRIMARY KEY ((userId,status), ts)
)with clustering order by (ts desc);

在这里,每当发出好友请求时,我都会在两个表中插入记录。 当我想检查一对一的用户状态时,我将使用以下查询:

SELECT status FROM friends WHERE userId=xxx AND friendId=xxx;

当我需要查询所有处于待处理状态的记录时,我将使用:

SELECT * FROM friends_by_status WHERE userId=xxx AND status='pending';

但是,当状态发生变化时,我可以更新“status”和“ts”'朋友们'表中,但不在'friends_by_status'表,因为两者都是主键的一部分。

您可以看到,即使我将其非规范化,我也肯定需要更新“friends_by_status”表中的“status”和“ts”以保持一致性。

我保持一致性的唯一方法是删除记录并再次插入。
但在cassandra模型中也不建议频繁删除。正如 Cassandra Spotify 峰会上所说。 http://www.slideshare.net/planetcassandra/8-axel-liljencrantz-23204252

我发现这是 Cassandra 的最大限制。

有没有其他方法可以解决这个问题。

任何解决方案表示赞赏。


我不知道您需要多长时间部署它,但在 Cassandra 3.0 中您可以使用物化视图来处理它。您的 Friends 表将是基表,friends_by_status 将是基表的视图。当您更改基表时,Cassandra 会小心更新视图。

例如:

CREATE TABLE friends ( userid int, friendid int, status varchar, ts timeuuid, PRIMARY KEY (userId,friendId) );
CREATE MATERIALIZED VIEW friends_by_status AS
    SELECT userId from friends WHERE userID IS NOT NULL AND friendId IS NOT NULL AND status IS NOT NULL AND ts IS NOT NULL
    PRIMARY KEY ((userId,status), friendID);

INSERT INTO friends (userid, friendid, status, ts) VALUES (1, 500, 'pending', now());
INSERT INTO friends (userid, friendid, status, ts) VALUES (1, 501, 'accepted', now());
INSERT INTO friends (userid, friendid, status, ts) VALUES (1, 502, 'pending', now());
SELECT * FROM friends;                

 userid | friendid | status   | ts
--------+----------+----------+--------------------------------------
      1 |      500 |  pending | a02f7fe0-49f9-11e5-9e3c-ab179e6a6326
      1 |      501 | accepted | a6c80980-49f9-11e5-9e3c-ab179e6a6326
      1 |      502 |  pending | add10830-49f9-11e5-9e3c-ab179e6a6326

现在,您可以在视图中按状态选择行:

SELECT * FROM friends_by_status WHERE userid=1 AND status='pending';

 userid | status  | friendid
--------+---------+----------
      1 | pending |      500
      1 | pending |      502

(2 rows)

然后,当您更新基表中的状态时,它会自动在视图中更新:

UPDATE friends SET status='pending' WHERE userid=1 AND friendid=501;
SELECT * FROM friends_by_status WHERE userid=1 AND status='pending';

 userid | status  | friendid
--------+---------+----------
      1 | pending |      500
      1 | pending |      501
      1 | pending |      502

(3 rows)

但请注意,在视图中,您不能将 ts 作为键的一部分,因为您只能从基表中添加一个非键字段作为视图中键的一部分,在您的情况下将添加“status” ' 到关键。

如果您想尝试一下,我认为 3.0 的第一个测试版将于明天发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cassandra - 使用 ORDER BY 和 UPDATE 集群键的替代方法 的相关文章

  • Spark Scala Cassandra 连接器删除所有行失败,并出现 IllegalArgumentException 要求失败异常

    创建表 CREATE TABLE test word groups group text word text count int PRIMARY KEY group word 插入数据 INSERT INTO test word group
  • Cassandra - 使用 ORDER BY 和 UPDATE 集群键的替代方法

    我的架构是 CREATE TABLE friends userId timeuuid friendId timeuuid status varchar ts timeuuid PRIMARY KEY userId friendId CREA
  • 通过updateTable创建多个GSI

    我在用着更新表 http docs aws amazon com AWSJavaScriptSDK latest AWS DynamoDB html updateTable property根据 DynmaoDB 的规定 根据文档 如果我们
  • Cassandra 按非聚集键对结果进行排序

    我们使用 Cassandra 的用例是显示前 10 个recent博客文章的访问者 以下是 Cassandra 表定义 CREATE TABLE blogs by visitor blogposturl text visitor text
  • NoSQL(MongoDB)与 Lucene(或 Solr)作为数据库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着基于文档数据库的 NoSQL 运动的发展 我最近关注了 MongoDB 我注意到如何将项目视为 文档 就像 Lucene 以及 Solr 用
  • Cassandra 中的数据分布

    我听说过 Cassandra 及其发行版 其实想知道数据在整个集群中是如何分布的现象 我的意思是 Cassandra 如何决定哪些节点拥有哪些数据 如果您了解 HashTable 数据结构以及 Hashtable 中如何进行哈希处理 那么这
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys
  • Cassandra Nodetool Repair 的具体作用是什么?

    From http docs datastax com en cassandra 2 0 cassandra operations ops repair nodes c html http docs datastax com en cass
  • mongodb 正在运行吗?

    我已经在我的 Unix 服务器上安装了 Mongodb 和 PHP 驱动程序 我的问题是如何判断 Mongodb 是否正在运行 是否有一个简单的命令行查询来检查状态 如果我从外壳程序启动一次 如果我退出外壳程序 它会继续运行 情况似乎并非如
  • CAP 定理 - 可用性和分区容错性

    当我尝试理解CAP中的 可用性 A 和 分区容错性 P 时 我发现很难理解各种文章的解释 我感觉A和P可以在一起 我知道事实并非如此 这就是为什么我无法理解 简单解释一下 A和P是什么以及它们之间的区别 一致性意味着整个集群中的数据是相同的
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • 允许在cql中进行过滤、数据建模

    我目前正在使用和研究 cassandra 中的数据建模实践 到目前为止 我知道您需要基于执行的查询进行数据建模 然而 多个select需求使得数据建模变得更加困难或不可能在一张表上处理它 所以 当你无法在1个表上处理这些要求时 你需要插入2
  • 查询 cassandra 表时出现“输入时没有可行的替代方案”错误

    我在 Cassandra 中有一张这样的表 CREATE TABLE vroc sensor data dpnode text year int month int day int data timestamp bigint data se
  • Redis AOF fsync(始终)与 LSM 树

    我对日志结构化合并树 LSM 树 的理解是 它利用了附加到磁盘非常快 因为它不需要查找 这一事实 只需将更新附加到预写日志并返回到客户端即可 我的理解是 这仍然提供了立即的持久性 同时仍然非常快 我不认为 Redis 使用 LSM 树 它似
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • Elasticsearch 聚合过滤器

    因为我在谷歌上找不到任何东西 是否可以在elasticsearch中过滤聚合 我正在考虑这样的事情 获取 SOME object X gt 100 的所有对象 提前致谢 编辑 样本数据 我有以下文档结构 docKey 1 value 2 d
  • Apache Cassandra 中的复合索引

    我正在尝试设置一个 cassandra 列族 其中一些列上有二级索引 在读回数据时我需要进行过滤 在我最初的测试中 当我一起使用多个索引时 速度会变慢 这是我当前的配置方式 通过 cassandra cli update column fa
  • 如何使用 DataStax java 驱动程序增加 cassandra 中的每秒事务数 (TPS)

    设置 2 节点 Cassandra 2 0 7 31 集群 副本 1 DataStax java 驱动程序 2 0 Problem 我正在使用 Datastax java 驱动程序进行负载平衡 我并通过 Jmeter 生成 50000 线程
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • ArangoDB:(1 个具有多个边缘定义的图)Vs(每个图 1 个边缘定义)

    我想知道在一个图中拥有多个边定义与每个图都有一个边定义相比是否有任何优势 谢谢你的帮助 使用多个边缘定义而不是仅使用一个边缘定义有多种原因 显示内容差异 您可能需要不同的边缘集合bought and watched 不过 这也可以通过使用标

随机推荐