У меня есть дизайн стола, который представлен этим удивительным нарисованным от руки изображением.
По сути, у меня есть событие учетной записи, которое может быть либо транзакцией (платеж третьей стороне или от нее), либо переводом (переводом между учетными записями, принадлежащими пользователю).
Все общие данные хранятся в таблице событий (Date
, CreatedBy
, Source Account Id
...), а затем, если это транзакция, то данные, относящиеся к транзакции, хранятся в таблице транзакций учетной записи (третья сторона, тип транзакции (Debit
, Credit
).. .). Если событие является переводом, то конкретные данные о переводе находятся в таблице account_transfer (Amount
, destination account id
...).
Обратите внимание, что я забыл нарисовать, это то, что таблица событий имеет event_type_id
. Если event_type_id = 1
, то это транзакция. Если это 2
, то это Перенос.
И таблицы переноса, и таблицы транзакций связаны с таблицей событий через внешний ключ идентификатора события.
Обратите внимание, что транзакция не имеет суммы, так как транзакция может быть разделена на несколько платежных строк, поэтому у нее есть дочерняя account_transaction_line. Чтобы получить сумму транзакции, вы суммируете ее дочерние строки.
Все внешние ключи настроены, с индексом первичных ключей...
Мой вопрос касается дизайна и запросов. Если я хочу перечислить все события для определенной учетной записи, я могу:
Select
from Event,
where event_type = 1 (transaction),
then INNER join to the Transaction table,
and INNER join to the transaction line (to sum the total)...
and then UNION to another selection,
selecting
from Event,
where event_type = 2 (transfer),
INNER join to transfer table...
and producing a list of all events.
or
Select
from Event,
then LEFT join to transaction,
then LEFT join to transaction line,
then LEFT join to transfer ...
and sum up totals (because of the transaction lines).
Что эффективнее? Я думаю, что вариант 1 лучше, так как он позволяет избежать ЛЕВЫХ соединений (сканирования?)
OR...
Индексированное представление варианта 1?