Google Cloud Spaner父母,子女,祖父母,孙子

时间:2018-06-29 12:08:28

标签: google-cloud-platform google-cloud-spanner

一些背景:

我正在建立一个模式,在该模式中,一个帐户创建一个会话,该会话基本上是一种付款,并且当另一个帐户决定支付交易时,将产生一笔钱,并将资金转移到发起该会话的帐户中。

我希望能够在这些表上执行各种查询,并且我希望这样做尽可能高效。

我想到了这种模式:

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为account1account2的帐户。 account1为ID为session的100欧元创建了一个会话,因此我们在(account1, session, 100)表中获得一行session。然后account2决定支付100欧元,并创建了ID为transaction的交易,在(transaction, session, account2)表中给了我们transaction行。

现在这不起作用,因为在transaction表中我没有引用父表中的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;

但是现在我还没有找到任何方法来创建payersAccountId到帐户表的交错索引,因为名称与该表中的任何键列都不匹配。我觉得这有点奇怪,我认为应该可以为具有不同名称的列创建交错索引(也许是,但是我缺少了一些东西)。

我需要的是一种解决方法,将所有帐户,会话和交易保持在同一拆分中,并能够从transaction表开始查询付款人和收款人的帐户。另外,我想知道是否有任何方法可以在同一张表中基于不同的列创建多个交错索引,例如在accountIdpayerAccountId的示例中。

感谢您抽出宝贵时间:)

1 个答案:

答案 0 :(得分:0)

如果表与列名不匹配,则无法插入表。

payersAccountId添加到transaction表是个好主意,这样您就可以执行将payersAccountIdsessionId和{{1} },如下所示:

accountid