Регистрация  |  Вход

ORM: немного теории

Время от времени участники форума пишут блоговые статьи, что прекрасно, но такие статьи подразумевают знание предмета и предполагают наличие решения.

А что, если ты что-то изучаешь, и у тебя еще нет понимания предмета, но есть желание запомнить, зафиксировать некоторые идеи, мысли. На этот случай есть раздел «Курилка», где, что хочешь, то и пиши.

Работа только в СФ и использование его простой в обращении ORM в конце концов может привести к «атрофированию» способности к работе с Персистентностью и БД на Java и других платформах.

Поэтому я решил почитать книжек по Java Персистентность с Hibernate. В одной из них есть вводная глава по ORM. Там я нашел несколько мыслей, которые показались интересными.

-«Данные живут дольше самого приложения»

- при попытке создания объектно-реляционное отображения разработчики столкнулись с несколькими «несовпадениями парадигм»:

(1) The problem of granularity.
Как я понимаю, это то, что мы изначально принимаем как данность, и уже не ощущаем как проблему: в коде мы можем создать объекты любого типа, а вот в БД есть только несколько доступных типов (а возможности поддержки user-defined datatypes в БД не велики), так что создавая сущности, чьи данные требуют сохранния в БД, мы всегда думаем как разбить сущность, как например Адресс на группу полей вроде Город, Код, Страна...

(2) The problem of subtypes
В коде мы можем наследовать классы друг от друга, а вот с таблицами БД так просто не получится, потому что a table is not a type.

(3) The problem of identity.
Хотя эта проблема не кажется очевидной, но вы столкнетесь с ней в растущих и больших приложениях, когда нужно удостовериться является ли два объекта идентичными. Есть три пути решить проблему, два а Джаве и один в БД.
С Джавой все понятно:
--Идентичность объекта, то есть мемори локейшнЖ а==в
--Равенство по значению, определяется имплементацией метода equals().
И с БД все понятно, identity определяется первичным ключом.
[так в чем же проблема? Сам не знаю, но возможно следующая строка что-то прояснит]
Является обычным для нескольких не-идентичных объектов одновременно представлять одну и ту же запись БД, например в одновременно протекающих тредах.

(4) Problems relating to associations
[вот это мне больше всего понравилось, заставило задуматься]
есть два класса, у каждого есть поле ссылка на другой класс. При создании экземпляров этих классов можно создавать отношения между объектами типа от Многих к Многим, так как связью между объектами является ссылка.
А вот создать отношение от Многих к Многим между записями в БД так просто не получится, так как в записях «связью» является внешний ключ. Поэтому для таких связей между записями приходится создавать Junction table, запись которой содержит два внешних ключа, создавая таким образом отношение Many-to-Many.

Пока все, может позже еще что интересного «начитаю».

Время от времени участники форума пишут блоговые статьи, что прекрасно, но такие статьи подразумевают знание предмета и предполагают наличие решения.

А что, если ты что-то изучаешь, и у тебя еще нет понимания предмета, но есть желание запомнить, зафиксировать некоторые идеи, мысли. На этот случай есть раздел «Курилка», где, что хочешь, то и пиши.

Работа только в СФ и использование его простой в обращении ORM в конце концов может привести к «атрофированию» способности к работе с Персистентностью и БД на Java и других платформах.

Поэтому я решил почитать книжек по Java Персистентность с Hibernate. В одной из них есть вводная глава по ORM. Там я нашел несколько мыслей, которые показались интересными.

-«Данные живут дольше самого приложения»

- при попытке создания объектно-реляционное отображения разработчики столкнулись с несколькими «несовпадениями парадигм»:

(1) [b]The problem of granularity.[/b]
Как я понимаю, это то, что мы изначально принимаем как данность, и уже не ощущаем как проблему: в коде мы можем создать объекты любого типа, а вот в БД есть только несколько доступных типов (а возможности поддержки user-defined datatypes в БД не велики), так что создавая сущности, чьи данные требуют сохранния в БД, мы всегда думаем как разбить сущность, как например Адресс на группу полей вроде Город, Код, Страна... 

(2) [b]The problem of subtypes[/b]
В коде мы можем наследовать классы друг от друга, а вот с таблицами БД так просто не получится, потому что a table is not a type.

(3) [b]The problem of identity.[/b]
Хотя эта проблема не кажется очевидной, но вы столкнетесь с ней в растущих и больших приложениях, когда нужно удостовериться является ли два объекта идентичными. Есть три пути решить проблему, два а Джаве и один в БД.
С Джавой все понятно:
--Идентичность объекта, то есть мемори локейшнЖ а==в
--Равенство по значению, определяется имплементацией метода equals().
И с БД все понятно,  identity определяется первичным ключом.
[так в чем же проблема? Сам не знаю, но возможно следующая  строка что-то прояснит]
Является обычным для нескольких не-идентичных объектов одновременно представлять одну и ту же запись БД, например в одновременно протекающих тредах.

(4) [b]Problems relating to associations[/b]
[вот это мне больше всего понравилось, заставило задуматься]
есть два класса, у каждого есть поле ссылка на другой класс. При создании экземпляров этих классов можно создавать отношения между объектами типа от Многих к Многим, так как связью между объектами является ссылка.
А вот создать отношение от Многих к Многим между записями в БД так просто не получится, так как в записях «связью» является внешний ключ. Поэтому для таких связей между записями приходится создавать Junction table, запись которой содержит два внешних ключа, создавая таким образом отношение Many-to-Many.

Пока все, может позже еще что интересного «начитаю».

Спасибо что поделился мыслями.
Все конечно хорошо, но зачем так все сложно? Больше похоже не стенографию лекции о каких-то высших материях.
Правду ты сказал, что SF ORM отравляет наш мозг своей простотой, но в других ORM все не намного сложнее. Я их перепробовал кучу и везде все одно и тоже по сути (формат записи только другой).

Есть объект который своими свойствами мапится на колонки таблицы в бд. Есть функции создать новый, сохранить, найти записи в базе и обновить (ну и удалить). Те же самые связи между объектами также описываются на этапе инициализации.

Вот что мне не очень нравится, когда я сталкиваюсь с НЕ SF ORM, то в них абсолютно непривычно или вообще никак организована система хуков (наши любимые триггеры в SF). Вот с этим обычно появляется куча гемора если следовать привычке из SF, т.е. пытаться выжать этот функционал из ORM. Но оказывается все намного проще - тупо используем паттерны проектирования и выносим функционал из "триггеров" на уровень Domain Object (оборачиваем нашу ORM).

А вообще правильно что занялся изучением чего-то нового - скилов прибавляет море.

Спасибо что поделился мыслями.
Все конечно хорошо, но зачем так все сложно? Больше похоже не стенографию лекции о каких-то высших материях.
Правду ты сказал, что SF ORM отравляет наш мозг своей простотой, но в других ORM все не намного сложнее. Я их перепробовал кучу и везде все одно и тоже по сути (формат записи только другой).

Есть объект который своими свойствами мапится на колонки таблицы в бд. Есть функции создать новый, сохранить, найти записи в базе и обновить (ну и удалить). Те же самые связи между объектами также описываются на этапе инициализации.

Вот что мне не очень нравится, когда я сталкиваюсь с НЕ SF ORM, то в них абсолютно непривычно или вообще никак организована система хуков (наши любимые триггеры в SF). Вот с этим обычно появляется куча гемора если следовать привычке из SF, т.е. пытаться выжать этот функционал из ORM. Но оказывается все намного проще - тупо используем паттерны проектирования и выносим функционал из "триггеров" на уровень Domain Object (оборачиваем нашу ORM).

А вообще правильно что занялся изучением чего-то нового - скилов прибавляет море.