【问题标题】:How to implement trigger in Cassandra?如何在 Cassandra 中实现触发器?
【发布时间】:2017-10-20 22:44:32
【问题描述】:

有没有关于如何逐步实现 Cassandra 触发器的好的示例或指南?

我正在寻找一些高级的东西,比如在执行 INSERT 或 UPDATE 之后操作同一分区中的其他行。

不幸的是文档非常有限,我到目前为止只找到了这些链接:

示例

假设您想将日志放入表中,并在达到一定数量的日志条目时聚合它们。

CREATE TABLE simple_log (
    id int,
    event_id timeuuid,
    message text,
    PRIMARY KEY(id)
);

INSERT INTO simple_log (id, event_id, message) VALUES (1, now(), 'first');
INSERT INTO simple_log (id, event_id, message)  VALUES (1, now(), 'second');
INSERT INTO simple_log (id, event_id, message)  VALUES (1, now(), 'third');

当您按 ID 选择日志顶部时,您应该会返回一个汇总结果:

SELECT * FROM simple_log WHERE id = 1;

 id | event_id                             | message
----+--------------------------------------+---------
  1 | d97f92d1-b5a4-11e7-825c-495e6ea8608a |   first-second-third

【问题讨论】:

  • 我认为没有办法。 Cassandra 没有更成熟的数据库系统所具备的丰富选项集。此外,请考虑 Cassandra 的分布式特性。触发器会在哪里运行?触发器会被允许做什么?
  • @MarcBernier - 那么他们为什么将它包含在文档中呢?我不确定是否有计划引入更丰富的触发器功能,但在某些情况下,当您想要扩展数据库时,它会变得有用。

标签: cassandra cql cassandra-3.0


【解决方案1】:

您可以添加突变以将其他行操作到突变集合中,如示例中所示。

它和 CDC 都没有围绕它的大量文档,因为它通常建议不要使用它们,除非真的需要。像这样的分布式系统有很多复杂性,通常可以在您的应用程序层更好地推理。

为什么不在批次中包含其他突变?特别是在同一个分区中,它可能会工作得更好,并且在保持触发器部署在所有实例上同步和更新等方面需要更少的工作。

【讨论】:

  • 感谢您的回答。我主要是在寻找触发器的功能以及如何正确实现它们。批处理的主要问题是 CQL 操作可能无法执行复杂的任务,例如在插入新值后合并分区中的行。我将尝试为我的问题添加一个示例。
  • 在你的例子中,我建议添加 event_id 作为集群索引 PRIMARY KEY(id, event_id) 并添加 WITH CLUSTERING ORDER BY (event_id DESC) 然后你可以 SELECT * FROM simple_log WHERE id = '1' 它会给你第一,第二,第三作为前 3 个日志,您可以在没有触发器的情况下将其聚合到您的应用程序中。如果它只是为了浏览 cqlsh,你可以这样看。或者,可以考虑分区中的静态列,它是数据的“slug”,您可以在插入时使用 LWT 将您的字符串附加到它,直到它达到当前大小等。
猜你喜欢
  • 2019-09-19
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多