Оптимизация вложенных объектов в nhibernate - PullRequest
0 голосов
/ 25 июля 2011

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

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

Модель моего домена:

Это четыре сущности;

FormProfile - Заголовок, описание, дата создания и т. Д.
FieldGroup - Наборы полей с заголовком и другими свойствами
FormField - Каждая «строка» в группе полей, кроме «Zip & Area»
FieldProperty - Каждый ввод / выбор / радиокнопка в строке FormField. Ex. Текстовые поля для Zip & Area

Структура формы обычно выглядит примерно так:

  • FormProfile
    • FieldGroup
      • * 1034 поле формы *
      • FieldProperty
  • FieldGroup
    • поле формы
      • FieldProperty
      • FieldProperty

Каков наилучший способ загрузить FormProfile со всеми дочерними элементами, избегая как можно большего числа обращений к БД?

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Лучший способ для ИМО - использовать атрибут batch-size в ваших коллекциях.

Я предполагаю, что ваш класс FormProfile имеет коллекцию FieldGroups , которая имеет коллекцию FormFields , которая имеет FieldProperties коллекция.

Установите для batch-size разумное число (скажем, 20), которое будет number of collections для запроса сразу.

Таким образом, когда вы получаете и перемещаетесь по FormProfile, у вас будет только 3 дополнительных запроса (по одному для каждого типа коллекции). Эти запросы являются небольшими и быстрыми (они бьют только по одной таблице каждый и будут использовать поиск по индексу FK, если вы его определили), что обычно лучше, чем наличие большого денормализованного запроса.

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

0 голосов
/ 25 июля 2011

На ум приходят два метода:

  • Используйте кеширование, поэтому вы загружаете объекты только при первом просьба
  • Используйте активную выборку, которая создаст операторы SQL, которые использовать внешние объединения для извлечения дочерних записей в том же запросе, что и их Родитель.

NHibernate предоставляет кэш второго уровня, который является постоянным для SessionFactory (в отличие от обычного кэша первого уровня, который является постоянным для каждого сеанса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...