Создание CMS Объектная БД в реляционной СУБД

Полтора года назад начался цикл статей про создание гибкой CMS и главной темой, на которой остановились подробно, была реализация объектной модели данных в реляционной СУБД (в MySql). Новые статьи давно уже не писались, но работа над моделью данных продолжала кипеть, порой, доходив до безумия. Сейчас мне хочется поделиться результатами той не простой, но интересной работы. В статье рассматривается объектная модель данных и структура базы данных для неё.

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

Объектная модель

Объект

Рассмотрев поверхностно реальный мир, надеюсь, большинство сделает приемлемый вывод, что кругом одни объекты, объекты состоят из объектов или просто связаны между собой. Дом, окна, двери в нем, жильцы, их руки и ноги, клетки, молекулы, атомы и так далее и подробней. Говоря об объектах, о связях между ними, о свойствах, мы оперируем своим воображением, у каждого по-своему уникальная модель воображения. Но сейчас задача не воображения рассматривать, а создать компьютерную объектную модель для представления в ней информации о реальном или воображаемом мире. Объект в этом случаи ассоциируется не только с чем-то единым из реального мира, но и с образами наших воображений, виртуальных миров и ещё неизвестно с чем.

Свойства и связи

Свойство объекта – это связанный с объектом другой объект. В реальности, где именно связь между объектами, сложно сказать. Где, например связь между головой и телом человека? Шея? А где связь между шеей и головой? Так дойдем до поиска связи между атомами и не остановимся. Нам же достаточно просто указать, что объект «А1» связан с объектом «Ж8». Думаю, понятно, что нужно хранить идентификаторы двух объектов. Мне же хочется сказать сразу о специфичности отношений в моделируемой структуре. Сначала пример. Возьмем несколько объектов класса «Деревяшка». Один объект сделаем свойством для шкафа, и он будет называться дверцей, другой сделаем свойством комнаты, и он будет называться дверью, другой свойством стола и называться столешницей и так подробнее. Объекты можно «поменять местами», но дверь у комнаты так и останется дверью. Название объекта – это не его свойство, оно даётся через отношение. Значит, название должно быть свойством отношения (связи).

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

Связи «композиция» и «агрегация»

Связи между объектами в ООП различают по виду – агрегация, композиция и их обобщение (ассоциация). Нам достаточно двух видов связей между объектами. Агрегация – это независимая связь, удалив один объект, связанные с ним агрегацией объекты должны сохраниться. Композиция – это связь между цельным и его составляющими (частями), например, удаляя товар, нужно удалить его описания, фотографии, отзывы. Если объект является частью другого, то он уже не может быть частью ещё для одного объекта. Нужно заметить, что композиция образует иерархию и это лучше учесть в структуре БД для последующей возможности выполнять быстрые выборки с условиями по иерархии.

Атрибуты

Чтобы в точности смоделировать реальный мир, нужно что-то соизмеримое со всей вселенной. А у нас в распоряжении только MySQL. Поэтому мы не можем дробить объекты до атомного уровня и более, чтобы выявить нечто атомарное и из него всё смоделировать. Поэтому кроме свойств у объектов появляются атрибуты. Обязательный атрибут каждого объекта – его идентификатор. Кроме идентификаторов могут быть любые другие атрибуты, которые не выразить через объекты. Например, объект «строка1» мы не будем дробить на объекты-символы строки, а символы ещё на что-то, достаточно саму строку представить в атрибуте value. У связей между объектами атрибутами будет вид связи, идентификаторы связываемых объектов и другие характеристики. Используя атрибуты, мы останавливаем детализацию объекта на нужном уровне.

Класс

В реальном мире классы не увидеть. Они, либо непостижимы нашим разумом, образующие законы вселенной, либо классифицирующая информация в наших мыслях. В общем, это не особо важно, так как предназначение класса ясно из ООП. Классом определяется свойства и атрибуты, которые должны быть у экземпляров (объектов) этого класса.

Класс не должен быть какой-то специфической информацией, используемой только логикой программы, выполняющей объектно-реляционную проекцию (ORM). Если класс сделать объектом, то можно создавать свойства для него как для объекта, давать названия, описания и общими методами использовать классы в программе. И вот тут-то начинается интересное. Если делать класс (А) объектом, то нужен класс (Б) для описания свойств класса (А), а потом класс (В) для описания свойств класса (Б) и так далее. С детализацией объектов остановились через атрибуты. Чтобы избавится от бесконечных уровней метаданных, можно сделать так, чтоб класс (Б) описывал свойства всех классов и себя самого.

Так как классы делаем объектами, далее будет применяться термин сущность для обобщения объектов-классов, объектов-связей и обычных объектов. Забыл сказать – раз связи то же являются объектами, то для них тоже должен быть класс.

Определение классом свойств

При программировании класса, описание свойств осуществляется указанием имени свойства и класса, с объектами которого позволено связываться. По сути, создаётся отношение между классами, которое используется как описание свойств между объектами. Из этого следует, что нам достаточно связывать классы между собой и использовать эти связи в логике ORM, как метаданные. Связывать между собой классы позволяет тот факт, что классы являются объектами. Так как классы могут иметь свойства, как объекты, необходимо различать обычные связи и связи, определяющие свойства объектов. Достаточно ввести дополнительный атрибут «is_define» для связей и учитывать его в логике ORM.

Тут может получиться интересная ситуация. По идеи, ничто не мешает создать определяющую свойство связь между обычным объектом и классом или просто между объектами. Если такую ситуацию учесть в логике ORM, то любой объект сможет исполнять роль класса! Но нужно ещё обдумать практичность такой возможности. Сейчас не будем обдумывать.

Дополнительными атрибутами связи, определяющей свойства, будут признак, обязательное свойство или нет, и вес свойства – множественное или одиночное. Если свойство множественное, то объект может иметь несколько связей с одинаковым именованием. Логикой ORM связи множественного свойства группируются по имени, и предоставляется программный интерфейс для работы со списками.

Связь «наследование»

Между классами проявилась связь, определяющая свойства у объектов, но она как третий вид не рассматривается. (Ранее между объектами выделены два вида связи – композиция и агрегация). Однако между классами есть особый вид связи, похожий на композицию – это наследование. Наследование, как и композиция, образует иерархию. Наверно, ясно без дополнительных разъяснений, что бы наследовать один класс от другого, достаточно создать связь вида «наследование» между ними. Ничего нового создавать не надо, но нужно различать данный вид связи в логике ORM.

Связь «экземпляр»

И есть ещё один незаметный вид связи – отношение между классом и его объектами. Опять-таки, эта связь композиционного вида – объект принадлежит только одному классу и, по сути, является его составляющим, удаляя класс, нужно удалить его объекты.

Композиционный вид связи, в том числе наследование и отношение между классом и его объектами, характерен ещё тем, что владелец (родитель) ссылается на своих подчиненных, а не наоборот. Это расходится с UML, в котором наследование показывается стрелочкой от наследника к родителю. Если представить реализацию на программном уровне, то класс будет иметь массив своих объектов, объект «статья» будет иметь массив комментариев и каждый комментарий массив своих комментариев. Каждый класс будет иметь ещё и массив своих классов-наследников. Удаляем родителя, удаляется и массив с его содержимым.

Теперь рассмотрим, как же всё это лаконично представить на таблицах. Чтобы в базе данных хранились объекты разных классов, хранились сами классы, определения свойств и атрибутов, учитывалось наследование классов и, главное, что бы с помощью SQL можно было работать с базой данных, как с объектной!

Реляционная структура

Для достижения гибкого управления и использования данных, необходимо вместе с данными в базе хранить метаданные. Метаданными для объектной модели являются классы. Если будем хранить классы в базе данных (БД), то сможем ими управлять (создавать, изменять) не программируя, например, в разделе администрирования сайта, а также выполнять поиск данных с условиями на метаданные, например, выбирать сущности, принадлежащие классу «А», с учетом наследования классов.

Таблица определяет простой класс

Создав таблицу в базе данных, мы, по сути, определим простой класс. Называние таблицы будет соответствовать имени класса, а колонки определять атрибуты для объектов. Записи в таблице рассматриваются как объекты. Но кроме атрибутов, необходимы ещё свойства объектов.

Таблица для класса «Связь»

Таблица связей

Создадим таблицу (link) для связей между объектами. В соответствующих колонках таблицы будут идентификаторы связываемых объектов (primary, secondary), вид связи (kind) и другие характеристики связи. Атрибуты связи необходимы в основном логике программы, осуществляющей объектно-реляционную проекцию (ORM), чтобы сохранить целостность данных и верно выполнить свою задачу по проекции. В созданной таблице будут храниться все виды связей между любыми объектами, классами и даже связями.

Таблица для класса «Сущность»

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

Таблица сущностей

Необходима отдельная таблица идентификаторов, создаем и называем её таблицей сущностей (entity), строки которой будут соответствовать каждой сущности (каждому объекту) модели данных. Главное назначение этой таблицы в уникальности идентификаторов. С появлением таблицы сущностей вырисовывается и реализация наследования классов, когда атрибуты одного объекта хранятся в нескольких таблицах. В таблице entity, кроме идентификатора необходимо ещё указать класс сущности, по которому определять, в каких таблицах «продолжение» объекта. Добавим атрибут class, но будем указывать в нём не имя класса, а идентификатор класса. Таким способ оптимизируется четвертый вид связи «экземпляр», т.е. этот вид связи не будет реализовываться как объект и храниться запись о нём в таблице link. Такое решение связано с нереальностью хранения всех связей на каждый объект, так как объектами являются и сами связи. Дополнительно об этом будет сказано в подразделе «магический треугольник».

Таблица для класса «Класс»

Таблица классов

Создаем таблицу для классов (class). Атрибутами класса являются идентификатор, системное имя, соответствующее имени таблицы и, при необходимости, атрибут-признак, можно ли класс наследовать (по мотивам ООП).

Чтобы установить наследование классов и определить свойства для объектов этих трех классов, необходимо создать соответствующие связи, фактически создать записи в таблице link.

Идентификаторы во всех таблицах, кроме entity являются внешними ключами, для реализации отношение 1:1 для сборки объектов размазанных по нескольким таблицам. В таблице entity идентификатор автоинкрементируется.

Схема базы данных

Обратите внимание, что идентификаторы классов так же должны быть уникальными среди всех объектов и не забываем, что классы должны быть объектами! Это значит, что записи, соответствующие классам, будут и в таблице entity, а в атрибуте class будет идентификатор класса (Б), которым определяются все классы. Подробнее о магии отношений между классами, ниже.

Магический треугольник

Эта статья написана ради рассказа о магическом треугольнике из трех базовых классов, поэтому читаем внимательно.

Уже было сказано, что для создания объекта необходим класс, которым определяются атрибуты и свойства объектов, но, чтобы создать класс, тоже необходим класс (другой)! Естественно, можно сначала создать вручную необходимые классы, а потом запустить систему. Так и придется сделать, но интересно рассмотреть, как между собой взаимосвязаны три базовых класса «Сущность» (entity), «Класс» (class) и «Связь» (link), так как в предложенной реализации нет исключения из утверждения, что у каждого объекта есть класс, и при этом классы то же являются объектами.

Для наглядности будем считать, что у классов есть свойство object, то самое свойство четвертого вида, которое на самом деле не реализуется в виде объектов.

Приступим. Нечто «Класс» необходим для создания классов, им должны определяться свойства и атрибуты для каждого класса, поэтому он назван классом. Его объектами должны быть все классы модели данных, в частности, «Сущность», «Связь» и он же сам – «Класс», чтобы самого же себя сделать классом.

Объекты "Класса"

На схеме показано свойство «objects», что оно связано с «Сущностью», «Связью» и «Классом». Но определения этого свойства ещё нет.

«Класс» сам себя и всех других делает классами, наделяя их характерными для классов атрибутами и свойствами – именем, возможностью иметь наследников «extends» и своих объектов «objects». Чтобы свойства «extends» и «objects» появились, должны существовать их определения. Их определения в классе «Класс». Кроме свойств, для классов определяются и атрибуты. Это просто колонки таблицы class.

Свойства и атрибуты классов

Свойство «extends» определяется связью на «Класс», а свойство «object» на «Сущность». Потому что наследниками у классов могут быть только классы, а экземплярами, как классы, так и простые объекты.

На схеме появились определения атрибутов и свойства в «Классе» и реализация атрибутов в каждом классе. Нечто «Сущность» и «Связь» стали классами, так как являются объектами класса «Класс». Теперь они то же могут иметь свойства «extends» и «objects».

Класс «Сущность» необходим для определения всем объектам атрибута «идентификатор» («id»). Допустим, атрибут такой определили, создав таблицу entity, но он не кем пока не реализуется, так как у класса «Сущность» ещё нет объектов. У класса «Сущность» пока нет объектов, но появляются два наследника – классы «Связь» и «Класс». Наследуя «Сущность», классы «Связь» и «Класс» перенимают (наследуют) определение атрибута «id».

Наследование "Сущности"

Отключаем последовательность в воображении и вспоминаем, что у «Класса» уже есть три объекта, а объектами реализуются определенные классами свойства и атрибуты. Что это значит? Это означает, что унаследованное «Классом» определение атрибута «id» от «Сущности» реализуется тремя объектами – ими же самими. «Сущность» реализует атрибут «id» — получает для него значение 1. «Класс» то же его реализует и получает значение 2. То же самое происходит со «Связью», он получает значение 3.

Класс «Сущность» сам себя делает сущностью через наследника «Класс»! Теперь получается, что класс «Класс» всех делает классами, а класс «Сущность» всех делает сущностями (объектами).

Но мы не учли, что просто так связи нельзя создавать. Чтобы определить свойства, необходимо было изначальное существование класса «Связь», так как созданные связи являются его объектами. Ситуация получается посложнее, чем с «курицей и яйцом». Три класса должны появиться и использовать друг друга одновременно. Последовательное появление невозможно.

Определение связей

Не удивительно, что свойство «objects» не реализуется на самом деле в виде объектов. Так как пришлось бы на каждую связи делать связь вида «экземпляр» от класса «Связь», потом на каждую связь между связями и классом «Связь» потом ещё и ещё и так до бесконечности. Оптимизировав реализацию связи «экземпляр», прикрыли ещё одну бесконечность.

Учитывая, что связи вида «экземпляр» не являются объектами, то на последней схеме всего объектов ровно 10. В таблице entity – 10 записей, в таблице class – 3 записи, в таблице link – 7 записей.

P. S.

Спроектированная объектная модель данных получилась достаточно гибкой, с широкими возможностями по структурированию и выборке информации. Остались ещё идеи по расширению её возможностей, но объектность не является залогом супер гибкости .Множественное наследование, нагромождение классов, различные костыли – всё это знакомо в мире ООП.

Но главной и не решенной проблемой оказалась производительность. Сложные SQL, сложности масштабирования через сегментирование данных и другое. Если вы разрабатываете свою ORM, то внимательно отнеситесь к балансу между гибкостью и производительностью. В изложенном варианте наблюдается перегиб в гибкости.

С января 2010 года началась работа над более простой, гибкой и масштабируемой моделью данных. Её основой стала иерархия и некоторые наработки в объектной модели. Но об этом чуть позже.

Всего доброго.

Комментарии

  1. cms4000:

    Всё это, конечно, очень хорошо и интересно…

    Но лично меня интересует один вопрос. В погоне за гибкостью в базе создаётся чрезмерное количество таблиц. Может и не чрезмерное, но ты хранишь там всё. В результате получается что для совершения какого-либо действия, система должна произвести очень много запросов к базе данных. Как следствие — возрастает объём памяти, необходимой для совершения какого-то действия, а также процессорное время.

    А теперь представь, что твоя система вышла на всероссийский уровень, и ею пользуются миллионы людей :)

    Что важнее? Гибкость или оптимизация по времени? :)

    • В том и сложность, что создавая гибкие всемогущие решения, очень сложно их сделать быстрыми и простыми одновременно. Важнее соблюдение баланса — этим статья и подытоживается. Когда разрабатывалась рассмотренная модель данных, вопросы производительности сознательно не затрагивались, чтобы «пропахать поле» и найти то самое гибкое решение. Теперь можно заниматься оптимизацией, денормализацией структуры бд, урезать лишние возможности. Можно заметить, что альфа версия движка работает вполне шустро, да в нём нет могучей объектной модели данных с orm.

    • lesa:

      Представить можно что угодно.. и тогда любая система ляжет..
      Уже написано море CMS для хомячков,бегающих внутри заданного колеса..

      Да будет больше гибкости и свободы! =)

  2. Владимир:

    Примерно этот механизм реализован на практике и используется уже более 10 лет Анатолием Тенцером.

    Ссылки по теме:
    http://www.interface.ru/fset.asp?Url=/misc/hran_01.htm
    http://www.interface.ru/fset.asp?Url=/misc/hran_02.htm
    http://rdbms.narod.ru/article/ordb/index.html
    http://sql-ru.corp.parking.ru/forum/actualthread.aspx?tid=246069&pg=1

    • А масштабированием такой бд занимались? Есть ли информация об этом? Потому как вижу по приведенным ссылкам примерно такие-же не простые запросы, значит расчленить бд на отдельные таблицы-порции уже сложно будет.

  3. Антон:

    1. в этой статье не занимаются оптимизацией, на сколько я понял
    2. если вы говорите об оптимизации базы данных, то не забывайте про оптимизацию времени разработчика и нагрузку на сервер приложений для обработки «оптимизированных» запросов
    3. а если система вышла на общероссийский уровень, то есть noSQL, да и стоимость кластера серверов на предложенных вами объемах не такая уж и большая цифра
    4. тактовая частота работы головного мозга человека ничтожна даже в сравнении с процессорами 8086, однако данные представляют собой похожую «неоптимизированную» структуру, а теперь попробуйте на существующую модель оптимизированной базы данных нанести …. ну например полносвязный граф другой размерности нежели ваша оптимизированная база данных, а это могут быть как карты городов с номерами домов расстояниями измеряемыми в пробках, так и отдельные бизнес процессы крупных дистрибьюторов косметики с мрачной логистической моделью. Будете базу данных переписывать?

    • О такой год назад ещё не знал. Да, в cubrid есть чему порадоваться и оптимизировать запросы под её возможности, что относится и к другим субд, к postger, например.

    • kadishmal:

      С CUBRID наша компания познакомилась уже 8 месяцев назад, когда мы решили, что с MySQL у нас все больше и больше проблем, да и будущее с ним что-то еще неясное. Тогда мы и решили опробовать новую, так называемую Оптимизированную для Веб Сервисов, СУБД CUBRID.

      Уже почти год, и я лично рад новым переменам. В моменты, когда у нас возникали проблемы с MySQL и нужен был проф. сапорт, представители MySQL в Корее откликались лишь на второй, а то и на пятый день. Это, по Вашему, нормально? В первые дни с CUBRID’ом версии 2.0 было много проблем, наши ребята, в том числе и я, не знали точно, как делать траблшут. Тут нам сапорт из разработчиков CUBRID очень было кстати. Максимум в течение 4 часов они уже на связи и готовы были помочь. Тогда я окончательно утвердил, что мы сделали правильное решение.

      Говоря по тебе, т.е. об объектно-реляционной СУБД, так вот оно перед Вами. CUBRID — изначально был разработан, как object-relational. Как раз для производителей онлайн игр объектная часть нужна больше, чем релящионная. Так для нас CUBRID — все смаки в одной упаковке.

      Что касается производительности, то правильно настроить и оптимизировать запросы с использованием индексов, и CUBRID будет летать действительно быстрее. Месяца два назад один из их ребят связался с нами с советом сделать переход на SSD диски. В принципе половина серверов у нас на SSD. Они нам дали результаты тестов, где CUBRID превосходит с большим отрывом и самого себя на HDD и MySQL даже на SSD. Вот сслыка на их ресурсы http://blog.cubrid.org/cubrid-comparison/cubrid-vs-mysql-ssd-performance-test-results/.

  4. ruslan:

    Предлагаю посмотреть на нашу Valentina Database
    http://www.valentina-db.com

    Разрабатывается 1993 года.

    * позиционируем как Object-Relational DBMS.
    * cross-platform. MAC WIN LINUX IPHONE

    * COLUMNAR format (!!!) Очень часто отрабатывает запросы раз в 50-60-100 быстрей традиционных

    * cross-model. Поддерживает Relational model, Object-Relational, Navigational, Network
    * SQL 92/93
    * API около 40-50 классов и порядка 1000 методов

    * может использоваться как embedded engine for applications with royalty free license,
    так и работать как Client/Server. Ваше приложение может одновременно работать как с локлаьными базами на винте так и с несколькими удалеными серверами

    * support C++ NET ObjC REALBasic VB Revolution, PHP Director, ODBC …

    * Одна из самых интересных концепций — VLink.
    http://valentina-db.com/dokuwiki/doku.php?id=valentina:vcomponents:vkernel:vlink:vlink

    Кроме ForeignKey предлагается более эффективный линки ObjectPtr and BinaryLink. Например джой по ObjectPtr идет в 4 раза быстрей и джойн двух M:М таблиц бинарным линком идет в 8 раз быстрей чем через ММ таблицу

    * годик назад сбацали интересное решение по рекурсивным запросам.

    и так далее и так далее

    вот чего еще нет — так это классного наследования. Не поверите, еще 15 лет назад отрисовал как надо его сделать правильно и красиво для баз данных, но руки все никак не дойдут.

  5. ruslan:

    ДЛЯ АВТОРА

    Свойство объекта – это связанный с объектом другой объект. В реальности, где именно связь между объектами, сложно сказать. Где, например связь между головой и телом человека? Шея? А где связь между шеей и головой? Так дойдем до поиска связи между атомами и не остановимся

    не соглашусь :)

    СВЯЗЬ между головой и телом — вовсе не шея и не атомы.
    а тот факт что данная голова — тыкаю пальцем на кого то, принадлежит (или ЯВЛЯЕТСЯ ЧАСТЬЮ) вот этого данного тела — снова тыкаю пальцем на тело того же человека.

    СВЯЗЬ есть — ПРИНАДЛЕЖИТ.

    даже если голову оторвет человеку, логическая связь что ЭТА голова ВОН ТОГО тела — по прежнему имеет место быть.

    • Вы перемешали реальность и семантику ваших знаний о голове и теле, что голова принадлежит тому человеку. В том и смысл примера, что реальным мир только воспринимается объектным, и то не всеми.

      Сможете, отключив все накопленные знания на некоторое время, взглянуть на мир? Вы не будете знать, что то нечто есть голова и, что она принадлежит тому телу)) вряд ли даже обратите внимание на некое месиво, которое, будучи имея знания о мире, вы назовете головой. По мере изучения окружающего мира, начинается структуризация, классификация знаний о нём и именно в базе знаний появляются объекты и отношения между ними. Кто-то знает о принадлежности головы, другой знает больше или меньше. Связь — не есть «принадлежать». Связи бывают разные, с разным смыслом.

  6. ruslan:

    АВТОРУ

    Хранение метаданных в ТРЕХ таблицах не нова я думаю

    Вот в Валентине мы юсаем всего лишь ДВЕ системных таблицы чтоб описывать всю сложность схемы.
    ДВЕ.

    одна из них описательная и не растет практически
    а вторая хранит
    — непосредственно объекты схемы (таблицы поля линки тригера процедуры вью)
    — их свойства (имена флаги и тд)
    — и взаимосвязи

    все решается ДВУМЯ таблицами.

  7. Igor:

    Все описанное выше относится к категории Worst practices (То, чего не следует делать). Давно рассказано Томом Кайтом здесь http://www.scribd.com/doc/7422356/Oracle-Database-Worst-Practices (см. странички How many tables do youre ally need?). Используйте любой ORM и будет Вам «щастие великое».

  8. Bratok:

    Здравствуйте, мы с вами братья по разуму и идеям. :)
    Я так же разработал схему хранения структуры классов и объектов в БД примерно 2 года назад. Он отдаленно напоминает вашу, но отдаленно. Но в связи с жизненными переменами ее развитие было отложено.
    В настоящее время у появилась возможность как-то дальше заниматься ее развитием и есть желание создать готовый проект.
    Но я наткнулся на несколько трудностей, основная — это поиск объекта(сущности) по атрибутам связанных логическим «и». Т.е. Крокодил зеленый И длинный». Я пока не вижу возможности, как сделать вложенный SELECT. Т.е. сначала выбрать только зеленых крокодилов, а потом из них длинных.
    Т.о. если атрибутов будет 5, вложенных Select будет 4, это плохо.
    Сталкивались ли вы с такой проблемой? Если — да, подскажите вариант решения.
    Или ссылки где можно почитать о чем-нибудь подобном.

    • Здравствуйте). Вместо вложенного запроса хорошо работает LEFT JOIN, но он несёт не меньшую нагрузку на субд, по сути является то же вложенным select.
      Необходимо на практике выявить самые частые виды запросов и с их учетом обновить структуру бд, …мне для этого потребовалось наступить на большую граблю, реализовывая реальный проект на описанной модели :)

    • А что нужно сказать? Есть ли в ней описанные проблемы или почему мы её не применяем?

      • Эмиль:

        Да, именно это. Так почему же?

        • Doctrine и другие ORM не вписываются в архитектуру Boolive. И цель проекта — не создание ORM, а создание гибкой структуры данных. Спроектированная объектная структура данных не поддерживается существующими ORM (достаточно маленьких отличий, чтоб программировать свою логику проекции). Ну а недостатки ORM общие (касается и нашего решения), в первую очередь, крайне сложно масштабировать базу данных. Поэтому мы отказываемся от классической объектно-ориентированности в структуре данных, теперь и ORM нам не нужны ))

  9. Vitaly Oborin:

    Зачем это всё знать конечному потребителю продукта? Или вы планируете поставить свою систему в музей как «самая правильная CMS в мире», не заработав на ней и рубля?

  10. Евгений:

    Здравствуйте.
    Подскажите пожалуйста, с помощью чего рисовали такие красивые диаграммы?!

    Спасибо.

  11. coder:

    Такие вещи я делал еще лет семь назад, когда смутно представлял, что такое «масштабирование», и как будет в реальности работать мой проект. Поверьте, когда число объектов начинает исчисляться миллионами и десятками миллионов, хранить их в трех таблицах — это неприемлемо. Сначала Вы разобъете эти таблицы по общим свойствам классов, затем — по классам, а дальше упретесь в то, что таблицы в базе данных зависят от логики приложения, а никак не наоборот.

Комментировать


(обязательно)


(обязательно) E-mail адрес не будет отображаться на сайте

*