Google cloud platform 谷歌云扳手父母、孩子、祖父母、孙子孙女
一些背景: 我正在构建一个模式,其中一个帐户创建一个会话,该会话基本上是一个支付,当其他帐户决定支付一笔交易时,生成该交易,并将资金转移到发起会话的帐户 我希望能够对这些表执行所有类型的查询,并且我希望它尽可能高效 我提出了这个模式:Google cloud platform 谷歌云扳手父母、孩子、祖父母、孙子孙女,google-cloud-platform,google-cloud-spanner,Google Cloud Platform,Google Cloud Spanner,一些背景: 我正在构建一个模式,其中一个帐户创建一个会话,该会话基本上是一个支付,当其他帐户决定支付一笔交易时,生成该交易,并将资金转移到发起会话的帐户 我希望能够对这些表执行所有类型的查询,并且我希望它尽可能高效 我提出了这个模式: CREATE TABLE account ( accountId STRING(MAX) NOT NULL, balance FLOAT64 NOT NULL, ) PRIMARY KEY(accountId); CREATE TABLE ses
CREATE TABLE account (
accountId STRING(MAX) NOT NULL,
balance FLOAT64 NOT NULL,
) PRIMARY KEY(accountId);
CREATE TABLE session (
accountId STRING(MAX) NOT NULL,
sessionId STRING(MAX) NOT NULL,
amount FLOAT64 NOT NULL,
) PRIMARY KEY(accountId, sessionId),
INTERLEAVE IN PARENT account ON DELETE CASCADE;
CREATE TABLE `transaction` (
transactionId STRING(MAX) NOT NULL,
sessionId STRING(MAX) NOT NULL,
accountId STRING(MAX) NOT NULL,
) PRIMARY KEY(sessionId, transactionId),
INTERLEAVE IN PARENT session ON DELETE CASCADE;
CREATE INDEX PayersAccountForSession ON `transaction`(accountId),
INTERLEAVE IN account
假设我们有两个id为account1和account2的帐户。account1使用id session为100欧元创建一个会话,因此我们在会话表中得到一行account1,session,100。然后account2决定支付100欧元,并创建一个id为transaction的事务,在事务表中为我们提供一个行事务、会话、account2
现在这不起作用,因为在事务表中,我没有引用父表中的accountId键,但在我的情况下,这个accountId与会话表中的id不同。
我可以这样做:
CREATE TABLE `transaction` (
transactionId STRING(MAX) NOT NULL,
sessionId STRING(MAX) NOT NULL,
accountId STRING(MAX) NOT NULL,
payersAccountId STRING(MAX) NOT NULL,
) PRIMARY KEY(sessionId, accountId, transactionId),
INTERLEAVE IN PARENT session ON DELETE CASCADE;
但现在我还没有找到任何方法为account表的PayerAccounted创建交叉索引,因为该名称与该表中的任何键列都不匹配。这对我来说似乎有点奇怪,我认为应该可以为不同名称的列创建交错索引,也许是这样,但我缺少了一些东西
我需要的是一种方法来解决这个问题,使所有帐户、会话和交易保持在同一个拆分中,并且能够从交易表开始查询付款人和收款人的帐户。另外,我想知道是否有任何方法可以在同一个表中创建多个交叉索引,但要基于不同的列,如accountId和payerAccountId示例中所示
感谢您的耐心等待:如果表与列名不匹配,则无法交错 将PayerAccounted添加到事务表是一个好主意,通过此操作,您可以执行将PayerAccounted与sessionId和accountid匹配的查询,如下所示: 从accountId=1的帐户中选择*从sessionId=1的交易中选择PayerAccountId