Время от времени участники форума пишут блоговые статьи, что прекрасно, но такие статьи подразумевают знание предмета и предполагают наличие решения.
А что, если ты что-то изучаешь, и у тебя еще нет понимания предмета, но есть желание запомнить, зафиксировать некоторые идеи, мысли. На этот случай есть раздел «Курилка», где, что хочешь, то и пиши.
Работа только в СФ и использование его простой в обращении 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). А вообще правильно что занялся изучением чего-то нового - скилов прибавляет море.