BugzillaORM — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
Строка 3: Строка 3:
 
А пока что это сборище идей.
 
А пока что это сборище идей.
  
Пример: http://rutube.ru/tracks/793494.html - доклад с YAPC::Russia. Автор Егор Шиповалов, название Применение ORM в Perl.
+
== Типичный взгляд ==
  
Первый же слайд ясно даёт понять проблемы, обычно решаемые с помощью объектно-реляционных мапперов:
+
Пример: http://rutube.ru/tracks/793494.html - доклад с YAPC::Russia. Автор — Егор Шиповалов, название «Применение ORM в Perl».
 +
 
 +
Первый же слайд ясно даёт понять проблемы, обычно решаемые авторами объектно-реляционных мапперов в Perl’е:
  
 
* Дублирование кода работы с БД.
 
* Дублирование кода работы с БД.
Строка 11: Строка 13:
 
* Необходимость знания устройства и работы с БД всеми программистами команды.
 
* Необходимость знания устройства и работы с БД всеми программистами команды.
  
Строго говоря, всё это «[[lurkmore:4.2|4ёрта.с.2]]». Тривиальный путь решения всех трёх проблем: код работы с БД для каждого «компонента» программы выносится в отдельный класс и разбивается на отдельные процедуры. При грамотном разбиении кода работы с БД на отдельные процедуры он получается достаточно компактным, а если не компактным, то по меньшей мере простым и очевидным. Весь код работы с БД таким образом становится сконцентрирован в одном месте, и переписывать под различные СУБД его становится гораздо проще. И уж конечно, имея код работы с БД в отдельном классе, неспециалисты по БД могут и не заниматься работой с ней.
+
Так вот, все эти причины — «[[lurkmore:4.2|4.2 (чёрта с два)]]». Бесплатная подсказка, тривиальный путь решения всех трёх проблем: код работы с БД для каждого «компонента» программы выносится в отдельный класс и разбивается на отдельные процедуры. При грамотном разбиении кода работы с БД на отдельные процедуры он получается достаточно компактным, а если не компактным, то по меньшей мере простым и очевидным. Весь код работы с БД таким образом концентрируется в одном месте, и переписывать под различные СУБД его становится гораздо проще. И уж конечно, имея код работы с БД в отдельном классе, неспециалисты по БД могут и не заниматься работой с ней. Между прочим, этот подход использует [http://www.skype.com/ Skype], за тем исключением, что функционал в процедуры они оборачивали не на стороне клиента БД, а внутри самой СУБД ([http://www.postgresql.org/ PostgreSQL]) — об этом Иван Золотухин рассказывал в статье «[http://postgresmen.ru/articles/view/25 Масштабирование PostgreSQL: Готовые решения от Skype]».
  
Есть и сложный путь — использование языка запросов типа [[rupedia:Language_Integrated_Query|LINQ]] или [[Funq]]. Ради решения этих трёх проблем они и был задуманы.
+
Ещё одна почти бессмысленная для веб-приложений возможность: итераторы. Даже {{CPAN|DBR}} её, кстати, не лишён. То есть она осмысленная — в GUI-приложениях. Но не в веб-приложениях, где, во-первых, сам DBI никогда не держит открытых курсоров, во-вторых, это часто не даёт делать СУБД, а в-третьих, это совершенно не нужно, так как время исполнения запроса должно быть как можно меньше, а следующий запрос, вероятно, попадёт в другой поток — а может, и вообще в другой процесс.
  
Тем не менее, ORM’а всё равно хочется. Даже Bugzilla имеет своё подобие ORM’а. ''Почему?''
+
Небольшой обзор существующих модулей ORM:
 
+
А вот некоторый обзор существующих модулей ORM:
+
  
 
* {{CPAN|SPOPS}} — ужас кривой, тормозной, неиллюзорный, заброшенный в 2004 году.
 
* {{CPAN|SPOPS}} — ужас кривой, тормозной, неиллюзорный, заброшенный в 2004 году.
Строка 27: Строка 27:
 
* {{CPAN|Class::AutoDB}}.
 
* {{CPAN|Class::AutoDB}}.
  
А вот ещё одна почти бессмысленная возможность: итераторы. Даже {{CPAN|DBR}} её, кстати, не лишён. То есть она осмысленная — в GUI-приложениях. Но не в веб-приложениях, где сам DBI, во-первых, никогда не держит открытых курсоров, во-вторых, это часто не даёт делать СУБД, а в-третьих, это совершенно не нужно, так как время исполнения запроса должно быть как можно более малым, а следующий запрос уже вряд ли попадёт в тот же поток (или вообще процесс).
+
== Реальная проблема ==
 +
 
 +
Реальная проблема, ради решения которой задуман ORM — сложность, возникающая при попытке организовать сохранение в БД кучи различных объектов '''разных типов''' со '''сложными отношениями''' друг между другом.
 +
 
 +
Даже [[lib:Bugzilla|Bugzilla]] имеет своё подобие ORM’а. И причина именно в этом — нужно управлять многими типами объектов. У бага много атрибутов, для каждого атрибута заведён отдельный тип «поле», а некоторые из этих типов одновременно являются самостоятельными объектами (продукты, компоненты).
  
 
[[Категория:Разработка]]
 
[[Категория:Разработка]]

Версия 16:16, 20 сентября 2009

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

А пока что это сборище идей.

Типичный взгляд

Пример: http://rutube.ru/tracks/793494.html - доклад с YAPC::Russia. Автор — Егор Шиповалов, название «Применение ORM в Perl».

Первый же слайд ясно даёт понять проблемы, обычно решаемые авторами объектно-реляционных мапперов в Perl’е:

  • Дублирование кода работы с БД.
  • Трудоёмкость адаптации кода под изменения схемы и различные СУБД.
  • Необходимость знания устройства и работы с БД всеми программистами команды.

Так вот, все эти причины — «4.2 (чёрта с два)». Бесплатная подсказка, тривиальный путь решения всех трёх проблем: код работы с БД для каждого «компонента» программы выносится в отдельный класс и разбивается на отдельные процедуры. При грамотном разбиении кода работы с БД на отдельные процедуры он получается достаточно компактным, а если не компактным, то по меньшей мере простым и очевидным. Весь код работы с БД таким образом концентрируется в одном месте, и переписывать под различные СУБД его становится гораздо проще. И уж конечно, имея код работы с БД в отдельном классе, неспециалисты по БД могут и не заниматься работой с ней. Между прочим, этот подход использует Skype, за тем исключением, что функционал в процедуры они оборачивали не на стороне клиента БД, а внутри самой СУБД (PostgreSQL) — об этом Иван Золотухин рассказывал в статье «Масштабирование PostgreSQL: Готовые решения от Skype».

Ещё одна почти бессмысленная для веб-приложений возможность: итераторы. Даже DBR её, кстати, не лишён. То есть она осмысленная — в GUI-приложениях. Но не в веб-приложениях, где, во-первых, сам DBI никогда не держит открытых курсоров, во-вторых, это часто не даёт делать СУБД, а в-третьих, это совершенно не нужно, так как время исполнения запроса должно быть как можно меньше, а следующий запрос, вероятно, попадёт в другой поток — а может, и вообще в другой процесс.

Небольшой обзор существующих модулей ORM:

  • SPOPS — ужас кривой, тормозной, неиллюзорный, заброшенный в 2004 году.
  • DBIx::Class — лидер области. Тяжеловесный, имеет кучу возможностей и вторую кучу — зависимостей. Например, использует mro 'c3'. Частично совместим с Class::DBI. Но вы как хотите, а «БД-независимый» язык запросов, основанный на хешах — это ад. Что-то типа Vsem::DB::Query из vsem.ru, кстати.
  • Class::DBI — говорят, легковесный. Наиболее старый — родился в 2001 году.
  • ORM — сразу настораживает фраза «No SQL queries needed». Не бывает такого.
  • DBR — весьма похож на Funq. Но явно попроще. Наиболее, кажется, «альтернативный».
  • Rose::DB::Object — ещё одна вариация на тему Class::DBI.
  • Class::AutoDB.

Реальная проблема

Реальная проблема, ради решения которой задуман ORM — сложность, возникающая при попытке организовать сохранение в БД кучи различных объектов разных типов со сложными отношениями друг между другом.

Даже Bugzilla имеет своё подобие ORM’а. И причина именно в этом — нужно управлять многими типами объектов. У бага много атрибутов, для каждого атрибута заведён отдельный тип «поле», а некоторые из этих типов одновременно являются самостоятельными объектами (продукты, компоненты).