我正在尝试了解 NoSQL 的内部结构,特别是 Apache Cassandra,并且我有一个对象执行问题。
据我所知,NoSQL 本身不支持存储过程,但支持用户定义函数 (UDF) 和触发器,但必须通过客户端驱动程序来实现,其中这些对象是在 JVM 中创建的,而 JVM 本质上存储在 Cassandra 库中/触发目录类型并在集群启动期间加载到数据库集群中。
根据 Apache Cassandra 文档,他们声明如下:
“构成触发器的实际逻辑可以用任何 Java (JVM) 语言编写,并且存在于数据库之外。您将触发器代码放置在 Cassandra 安装目录的 lib/triggers 子目录中,它会在集群启动期间加载,并且存在于参与集群的每个节点上。”
我的问题是,这些对象的实际执行是在服务器/应用程序端执行,然后将结果传递到 Cassandra,还是 Cassandra 有能力解释这些对象并在数据库端执行它们?
我问的原因是因为我的目标是减少服务器端调用,让服务器/应用程序尽可能自由地运行,并将更多的数据操作职责放在数据库上。从某种意义上说,这是泵和转储类型的流,其中服务器将数据发送到数据库,然后忘记它并返回到应用程序以侦听更多请求,而不需要额外的时间来处理数据。
这个问题是基于研究的,因为我正在对与将 SQL 数据库迁移到 NoSQL 相关的权衡进行风险成本分析(根据 Cassandra 的特定要求)。
NoSQL 本身不支持存储过程
总的来说,我认为这可能是正确的。然而,NoSQL 数据库有很多,并且它们的功能集差异很大。
这些对象的实际执行是在服务器/应用程序端执行,然后将结果传递到 Cassandra,还是 Cassandra 是否有能力解释这些对象并在数据库端执行它们?
在 Cassandra 中,UDF 和触发器 100% 在数据库端执行。这就是为什么自定义触发器的 JAR 位于集群中所有节点上的
lib/
目录中非常重要。同样,UDF 是架构的一部分,并且依赖于同一架构版本上的所有节点。