Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 谷歌云扳手父母、孩子、祖父母、孙子孙女_Google Cloud Platform_Google Cloud Spanner - Fatal编程技术网

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