Squeak.ru - шаблоны программирования

Как мне структурировать мою доменную модель

Я пытаюсь абстрагировать свою конкретную проблему домена от банковского счета, предположим следующую ситуацию:

  • У меня есть банковский логин определенного клиента.
  • Каждый Клиент может иметь несколько банковских счетов, принадлежащих одному логину.
  • Каждый банковский счет может иметь тысячи транзакций.

Я разработал структуру класса следующим образом (упрощенно):

public class Login
{
    private List<Account> _bankingAccounts;
    ....more fields, ctor, getters, setters...
}

public class Account
{
   private List<Transaction> _transactions;
    ....more fields, ctor, getters, setters...
}

public class Transaction
{
   String _comment;
    ....more fields, ctor, getters, setters...
}

Ну, но если у меня, скажем, 20 Аккаунтов и у каждого по 10000 транзакций, и я загружаю всю модель из базы данных, будет большой объем памяти, даже я не знаю, нужны ли клиентам все эти транзакции.

Я думал построить более упрощенную модель следующим образом:

public class Login
{
    private List<SimpleAccount> _bankingAccounts;
    ....more fields, ctor, getters, setters...
}

public class SimpleAccount
{
    ....more fields, ctor, getters, setters...
}

public class Account
{
   private List<Transaction> _transactions;
    ....more fields, ctor, getters, setters...
}

public class Transaction
{
   String _comment;
    ....more fields, ctor, getters, setters...
}

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

Так будет нормально? Есть ли лучший подход?


  • Для длинного списка транзакций вы можете выполнить пейджинг на стороне сервера. 30.07.2012

Ответы:


1

Из вашего вопроса я понял, что вашей основной потребностью является ORM, потому что (если я не ошибаюсь) вы хотите две вещи:
отображение модели домена
но
с отложенной загрузкой
Посредством отложенной загрузки Мы имеем в виду, что реляционные объекты загружаются только тогда, когда мы пытаемся получить к ним доступ. Просто, когда вы хотите увидеть определенные данные студента, которые вы никогда не хотите автоматически загружать все курсы студента (которые могут быть коллекцией), если только вы не хотите см. его/ее курсы (в случае, если студент и курсы имеют отношение).
Поэтому для вашей проблемы вы должны использовать ORM, который предоставит вам оба решения :)
Вот список некоторых ORM, предоставленных .Net

30.07.2012

2

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

Кроме того, если вы используете любую приличную ORM-систему (например, entity-framework) вы можете загрузить из БД только нужные вам данные, а не весь граф объектов.

30.07.2012

3

Как сказал Серг, мысли о производительности относятся к реализации, а не к модели предметной области.

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

public class Account
{
   private List<Transaction> _transactions;

   public List<Transaction> getTransactions() {
        if(_transactions == null) {
             loadTransactions();
        }
        return _transactions;
   }
}
30.07.2012
  • но в этом случае я бы поместил DataAccess в модель предметной области. 30.07.2012
  • @ john84 используйте DAL, который поддерживает прозрачную (для модели предметной области) внешнюю загрузку. 30.07.2012
  • Вы можете отделить свою модель домена от доступа к данным либо путем разделения интерфейса и реализации, например. Учетная запись реализует IAccount или путем введения ServiceLayer, например: _transactions = serviceFactory.makeTransactionService().loadTransactions(); 30.07.2012

  • 4

    Существует шаблон под названием Event Sourcing, который, похоже, может вам помочь. Он основан на хранении событий (в вашем случае это транзакции), а не на промежуточной сумме, поэтому вы можете делать больше с данными.

    Этот шаблон решает ту же проблему, с которой вы столкнулись. Итак, есть дополнение к этому шаблону, называемое Snapshots. Создание моментального снимка, скажем, в конце каждого месяца, позволит вам взять момент времени и загрузить записи транзакций обратно в ближайший моментальный снимок. Снимок покажет учетную запись такой, какой она была на момент создания снимка (вероятно, результат последнего снимка или события открытия учетной записи со всеми промежуточными транзакциями).

    Если вы погуглите «Event Sourcing Snapshot», вы найдете множество статей, в которых обсуждается этот шаблон. Надеюсь это поможет.

    30.07.2012
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

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