Транзакции по очень очень большой группе лиц - PullRequest
5 голосов
/ 26 июля 2010

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

// example only, not meant to compile
public class TransactionAccount {
    private long balance;
    private List<Transaction> transactions = new ArrayList<Transaction>();
    ....
    public long getBalance() { return balance; }
}
private class Transaction {
    public Date date;
    public long amount;
}

Исходя из того, что я прочитал, единственный способ добиться целостности транзакций при вставке Transaction и обновлении balance - это сделать его одной группой сущностей.

Однако со временем для определенного TransactionAccount будут совершаться миллионы транзакций. Количество записей в эту группу объектов будет низким, но число операций чтения будет намного выше.

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

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

Расположение, которое вы описываете, должно работать нормально.Если ваша группа сущностей становится слишком большой (мы говорим о сотнях мегабайт транзакций, прежде чем это станет проблемой), вы можете написать процедуру для «свертывания» старых транзакций: транзакционно заменить набор старых записей транзакций однойсумма этих транзакций, чтобы поддерживать инвариант, что баланс равен сумме всех транзакций.Если вам все еще нужно хранить записи этих старых «свернутых» транзакций, вы можете сделать их копию в отдельной группе сущностей перед выполнением свертки.

2 голосов
/ 26 июля 2010

Вы правы, что Transaction и TransactionAccount должны находиться в одной и той же группе объектов для выполнения транзакции вставки и обновления.

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

...