- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Google Spanner 建议不要使用时间戳或序列号之类的东西作为主键或索引的初始部分,这基于架构是有意义的。但是,根据我的要求,我确实需要一些方法来确保行的严格“仅附加”顺序。
我正在使用 Spanner 为事件建模(如事件溯源)。每个事件都有一个类别、一个标识序列的流 ID,其中事件之间的关系需要严格排序,以及一些有效负载字段 - 从这里开始我将忽略实际有效负载。
天真地,这将被建模为:
| Category | STRING |
| Stream Id | STRING |
| Sequence Nr | INT64 |
(使用由类别、流 ID、序列号组成的主键。)这将确保一个流的事件的强排序。现在,由于某些类别有很多与之关联的事件,而 Spanner 最佳实践是在高位上有差异,因此最好将其翻转过来。每个“流”将包含数量相当少的事件(几千而不是数百万),并将一起读取以便更好地分发数据并鼓励属于一个流的事件的局部性:
| Stream Id | STRING |
| Category | STRING |
| Sequence Nr | INT64 |
但是,由于我希望能够附加事件而不必读取当前状态来找出当前序列号,所以我宁愿使用时间戳。
| Aggregate Id | STRING | |
| Category | STRING | |
| Timestamp | TIMESTAMP | allow_commit_timestamp |
Spanner 有一个内置的提交时间戳,可以在实际处理事务时对其进行标记。但最后的问题是:
是否可以像上面那样表示数据并获得唯一的提交时间戳,即使我在一个事务中提交多个事件?
如果不是,是否可以通过添加额外的列来确保顺序来确保严格排序?
documentation指出“不能保证提交时间戳值是唯一的。写入非重叠字段集的事务可能具有相同的时间戳。写入重叠字段集的事务具有唯一的时间戳。” - 但我不太清楚在这种情况下什么是“字段集”。
该文档还指出“提交时间戳使创建变更日志更容易,因为时间戳可以强制对变更日志条目进行排序。”但不清楚在多个并发编写器或同时写入多个事件的上下文中,提交时间戳具有强制顺序的保证是什么。
最佳答案
如果您在同一事务 中有多个事件,那么它们都将具有相同的提交时间戳。
字段是一个表格单元格(一行中有一个 col 值)。因此,在此上下文中的“非重叠字段集”基本上意味着单独的行,因为其中一个字段是提交时间戳!
两个独立的事务,同一张表上的一个更新行“R1”和一个更新行“R2”理论上可以具有相同的提交时间戳,因为它们不重叠。
Is it possible to represent data as above and get unique commit timestamps even if I commit multiple events in one transaction?
在您给出的示例中,您在主键中使用提交时间戳,那么不,您将无法在单个事务中将多个事件添加到同一 stream_id/category 对,因为它们具有相同的时间戳-- 因此主键相同。
If not, is it possible to ensure strict ordering some other way, by adding additional columns to ensure order?
如果您为每个(stream_id、类别、时间戳)元组使用提交时间戳和 sequence_number 的组合,那么您可以在单个事务中保持严格的顺序:
为同一事务中的每个 (stream_id, category) 对增加一个序列号,从 0 开始。提交时间戳将确保跨不同事务的顺序,而序列号将确保事务内的顺序...
关于database-design - 如何在 Spanner 中高效地创建强有序序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53632448/
我在 Google Cloud Spanner 中有一个 860M 行的表格,我试图了解解释的工作原理。 该表有一个字符串列 geoid并且该列有一个索引。 当我运行以下查询时,它只需要 36 毫秒:
我有 3 个节点的 Spanner 实例,以及一个包含大约 40 亿行的表。 DDL 如下所示: CREATE TABLE predictions ( name STRING(MAX),
我有 3 个节点的 Spanner 实例,以及一个包含大约 40 亿行的表。 DDL 如下所示: CREATE TABLE predictions ( name STRING(MAX),
Cloud Spanner 提供了两种不同的 API。 Cloud Spanner 读取与 Cloud Spanner SQL API 之间有什么区别? 最佳答案 在幕后,它们都使用相同的执行机制,因
给定以下表架构: CREATE TABLE Record ( -- uuidv4 recordId STRING(36) NOT NULL, -- uuidv4 use
我想使用动态查询生成器构建一个复杂的查询,GCP Spanner 中是否有动态查询生成器。 示例: DeleteQuery query = new DeleteQuery("account a").a
我有两个结构 type Row struct{ ID string Status string details Details } type Details struct{ Sessi
假设我有架构 CREATE TABLE Account ( AccountId BYTES(MAX), Foo STRING(1024) ) PRIMARY KEY (AccountId);" CRE
我正在创建一个 SpannerSingleton,以便在应用程序的生命周期内保持连接。我对连接持久性感兴趣...如果存在 session /连接问题,如何重新创建 session ? 一个想法是,如果
我正在尝试使用下面的代码从带有时间戳的 Google Spanner 表中读取内容。 import datetime as dt from google.cloud.spanner.client im
Google Spanner 建议不要使用时间戳或序列号之类的东西作为主键或索引的初始部分,这基于架构是有意义的。但是,根据我的要求,我确实需要一些方法来确保行的严格“仅附加”顺序。 我正在使用 Sp
我正在学习 gulp。我通过以下代码得出的。 wrench.readdirSyncRecursive('./gulp').filter(function(file) { return (/\.(j
在下面的代码中我可以获得适当的数据类型值。 Map mutationMap = mutation.asMap(); Value locationValue = mutationMap.getOrDef
我正在尝试写信来抓取来自 google pub/sub 的一些消息。写入 bigtable 是有效的,因此在基础层面上没有遗漏任何内容。 我已升级到 google-cloud-dataflow-jav
假设我有三个表,Foo、Bar 和 Baz CREATE TABLE Foo ( FooId BYTES(MAX) ) PRIMARY KEY (FooId); CREATE TABLE Bar (
如何在 Google 的 Cloud Spanner 数据库中进行联接? 连接查询会执行得很快吗? SQL(MySql、Oracle、MSSQL)和 NewSQL(Cloud Spanner/TiDB
我们可以在 google spanner DB 中使用地理空间查询吗?如果没有,是否有任何替代方法可以通过在应用程序服务器中移动空间计算来在 SQL 中使用空间查询? 最佳答案 Cloud Spann
我正在尝试使用 Spring Boot 通过 java 连接到 Google Spanner。我不想从数据库中读取某些内容并使用网络套接字发送它。目前我有: @Configuration @Enabl
我想将大数据插入 Google 的 Cloud Spanner 表。 这就是我正在使用node.js应用程序所做的事情,但它停止了,因为txt文件太大(几乎2GB)。 1.load txt file
我们目前使用 NodeJs 和 Knex 来连接 MySQL。 我们计划将数据库迁移到 Cloud Spanner。 所以想知道 knexjs 是否支持云 Spanner 。 我在他们的官网(http
我是一名优秀的程序员,十分优秀!