некоторый фон:
Я создаю схему, в которой одна учетная запись создает сеанс, который в основном является платежом, и когда какой-то другой счет решает оплатить, генерируется транзакция, и деньги переводятся на счет, инициировавший сеанс.
Я хочу иметь возможность выполнять все виды запросов к этой таблице, и я хочу, чтобы это было максимально эффективно.
Я придумал эту схему:
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
.
Спасибо, что нашли время:)