Чек-лист для .NET программиста: Уровень доступа к данным

В реляционной модели данные представлены в табличной форме, в то время как в объектно-ориентированных языках данные хранятся в виде графов объектов, что порождает целый ряд трудностей, когда дело доходит до преобразования объектов в табличную форму и наоборот: разные представление связей между зависимыми данными, отсутствие наследования в реляционном мире, несовпадение способов проверки идентичности и тд. (читай The Object-Relational Impedance Mismatch). Даже если программист решит вопрос преобразования, то перед ним возникнет проблема поддержки данных в базе и в оперативной памяти приложения в согласованном состоянии.

Во избежание вышеперечисленных и прочих проблем были разработаны технологии объектно-реляционного отображения (Object-Relational Mapping, ORM), реализующих в себе десятки шаблонов по преобразованию данных, отслеживанию изменений в объектах, реализации ленивой загрузки, кешированию, генерированию SQL запросов и тд. Программист получает возможность значительно быстрее разработать слой доступа к данным, как и возможность абстрагироваться от СУБД и работать только с объектами в оперативной памяти как с единственным хранилищем данных. Однако максимально полное абстрагирование может быть достигнуто только при работе над небольшими и слабонагруженными приложениями. В сложных проектах ORM является дополнением к SQL знаниям разработчика, а не их полной заменой.

В .NET к основным технологиям ORM относятся Entity Framework и HNibernate. Активное использование ORM при работе с огромными наборами данных может негативно отразиться на производительности разрабатываемого приложения. В таких случаях программисты могут использовать ORM для основной части системы, но для критически важных участков перейти на вызовы хранимых процедур и ручное написание SQL запросов. Другим возможным вариантом оптимизации может служить разделение приложения на 2 отдельных модуля. Первый модуль предназначен для записи данных в базу, в котором продолжает работать ORM. Второй — для чтения данных из базы, в котором работают микро ORM (Dapper или ORMLite), либо класcы ADO.NET (SqlConnection, SqlCommand и тд). Если к приложению изначально предъявляются максимально высокие требования к быстродействию со стороны чтения и записи, то в отдельных случаях использование классических ORM избегают вовсе.

Вопросы

  1. Как смоделировать отношение многие-ко-многим в объектной модели?
  2. Какая разница между подходами Code First и Database First в Entity Framework?
  3. Как решить проблему N+1 в Entity Framework?
  4. Какая разница между интерфейсами IEnumerable и IQueryable?
  5. Какое предназначение у шаблона Unit Of Work?
  6. Какую проблему решает шаблон Repository?
  7. В чем отличие между шаблонами Query Object и Specification?
  8. В чем заключаются недостатки шаблона Active Record?
  9. В чем идея алгоритма Hi/Lo?

Книги

Статьи

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s