google cloud spanner родители, дети, бабушки и дедушки, внуки - PullRequest
0 голосов
/ 29 июня 2018

некоторый фон:

Я создаю схему, в которой одна учетная запись создает сеанс, который в основном является платежом, и когда какой-то другой счет решает оплатить, генерируется транзакция, и деньги переводятся на счет, инициировавший сеанс.

Я хочу иметь возможность выполнять все виды запросов к этой таблице, и я хочу, чтобы это было максимально эффективно.

Я придумал эту схему:

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

Предположим, у нас есть два аккаунта с идентификатором account1 и account2. account1 создает сеанс за 100 € с идентификатором session, поэтому мы получаем строку (account1, session, 100) в таблице session. а затем account2 решает заплатить 100 €, и создается транзакция с идентификатором transaction, что дает нам строку (transaction, session, account2) в таблице transaction.

Прямо сейчас это не работает, потому что в таблице transaction у меня нет ссылки на ключ accountId из родительской таблицы, но в моем случае accountId - это другой идентификатор, отличный от идентификатора в таблице сеансов. , Я мог бы сделать это:

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. Также я хотел бы знать, есть ли способ создать несколько чередующихся индексов в одной таблице, но на основе разных столбцов, как в примере для accountId и payerAccountId.

Спасибо, что нашли время:)

1 Ответ

0 голосов
/ 21 декабря 2018

Невозможно чередовать таблицы, если они не совпадают с именем столбца.

Добавление payersAccountId в таблицу transaction является хорошей идеей, с этим вы можете сделать запрос, сопоставляющий payersAccountId с sessionId и accountid, как показано ниже:

SELECT * from account WHERE accountId = (SELECT payersAccountId FROM transaction WHERE sessionId = 1)

...