
Использование объектно-реляционного проецирования (ORM) стало в настоящее время фактически негласным стандартом при разработке Web-приложений Enterprise-уровня и использовании реляционных СУБД.
В настоящее время наиболее популярным способом решения данной проблемы является использование проектора Doctrine, реализующего паттерн ActiveRecord. Несмотря на соблазн «прикрутки» готового решения, многие команды идут по пути написания собственного ORM-движка. В частности, совсем недавно об опыте разработки собственного ORM рассказывал разработчик geometria.ru Михаил Шамин в своем докладе на проходившей в мае в Санкт-Петербурге конференции ZF Conf 2011.
О преимуществах и недостатках того или иного подхода можно спорить, но этот спор выходит за рамки целей данной статьи. А в этой статье я расскажу об опыте разработки и использования простейшего генератора готовых к использованию ORM-классов, реализующих стандартный CRUD-функционал (create, read, update, delete), и готовых к использованию в приложении на базе Zend Framework.
Читать дальше →
Недавно на Хабре мелькал вопрос — так нужен ли на самом деле ORM в крупном и сложном проекте? Ведь он часто медленный, громоздкий, поддерживает только некоторое подмножество SQL, не поддерживает специфический и очень удобный синтаксис, например, Oracle (тот же connect_by для иерархических запросов) и прочее и прочее.
Высказывалось мнение, что ORM в действительности нужен только в примитивных проектах, для сокращения размера кода, а в реально большом и сложном проекте лучше обойтись без него. Я скажу за большие проекты — за мелкие пусть скажут другие :) Оговорюсь, что рассуждения и примеры строю на Java / Oracle, классическая связка.
Читать дальше →
Into
Под .NET существует две родных ORM, разрабатываемых и поддерживаемых Microsoft, — Entity Framework и Linq2Sql. Однако Entity Framework продолжает развиваться внушительными темпами, а про будущее Linq2Sql ничего толком неизвестно.
Entity Framework предлагает удобный дизайнер, огромное количество вариантов маппинга, автогенерацию классов-моделей, но на все это есть жирный минус – гигантские и раздутые сгенерированные классы, которые к тому же нельзя изменять вручную – ибо при каждом изменении модели в дизайнере, все будет пересоздано заново. Сравните это с чистыми классами, и добавленными к ним атрибутами, как в Linq2Sql, и вы поймете, почему такое количество людей заявляет о легковесности Linq2Sql и монструозности EF.
Конечно, каждая проблема имеет решение, и эта не исключение. Частичные классы позволят добавить нужный функционал, а специально созданные классы с правилами валидации, помеченные атрибутом [MetadataType], дадут возможность использовать атрибуты валидации для классов-моделей. Но вместе это получается не очень красиво – размазанные по проекту классы, увеличение их количества, и все та же сложность в поддержке.
Не стоит также забывать об условиях работы классов-моделей: они должны либо наследоваться от EntityObject или реализовывать интерфейсы EntityWithKey, IEntityWithChangeTracker и IEntityWithRelationships
Так что же делать тем, кто хочет получить максимально простые классы для работы внутри ORM?
Читать дальше →
Инвалидация кеша, возможно, одна из самых запутанных вещей в программировании. Тонкость вопроса состоит в компромиссе между полнотой, избыточностью и сложностью этой процедуры. Так о чём же эта статья? Хотелось бы не привязываясь к какой-либо платформе, языку или фреймворку, подумать о том как следует реализовывать систему инвалидации. Ну а чтобы не писать обо всём и ни о чём, сконцентрируемся на кешировании результатов SQL-запросов построенных с помощью ORM, которые в наше время встречаются нередко.
Читать дальше →