Веб-разработка — объектная база данных и реляционная база данных

StackOverflow https://stackoverflow.com/questions/5358131

Вопрос

Каковы минусы и плюсы использования объектной базы данных или реляционной базы данных для обычной веб-разработки, которая требует большого количества CRUD?

ОБНОВЛЯТЬ:Я снова открыл награду за награду, чтобы передать ее Невиллу.

Это было полезно?

Решение

Реляционная база данных:

Плюсы:

  • Установленные технологии - много инструментов, разработчиков, ресурсов
  • Широкий ассортимент с открытым исходным кодом и коммерческими продуктами
  • Известно, чтобы масштабировать до очень больших участков и очень высокую пропускную способность
  • Выражает множество проблемных доменов в логическом и «программируемом» способе
  • Довольно стандартный язык (SQL)

Минусы:

  • Несоответствие импеданса с концепциями OO - моделирование «наследования» в базе данных не является естественным
  • Иерархические структуры обычно требуют специфичных для поставщика расширения языка
  • Нереляционные данные (например, документы) не являются естественным соответствием
  • Изменения в бизнес -домене могут быть трудно реализовать после определения схемы

OOBDMS

Плюсы:

  • Ближе подходит для концепций OO
  • Теоретически, разработчик должен работать только на одном языке - детали настойчивости абстрагируются. Это должно повысить производительность

Минусы:

  • Доступно значительно меньше инструментов/ресурсов/разработчиков.
  • Нет широко распространенных стандартов
  • Подход "черного ящика" к настойчивости может затруднить настройку производительности
  • Детали настойчивости часто протекают в дизайн OO (см. Примеры Марсело)

Другие советы

Концепция OODBMS довольно сломана, и различные коммерческие и бесплатные предложения, которые появились за последние несколько десятилетий, едва ли сделали тусет на рынке.

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

Запросы в OODBMS преимущественно обусловлены навигационными операторами, что означает, что если в вашей базе данных продаж имеют продавцы, владеющие своими продажами, то запросы на ежемесячные продажи для данного SKU, вероятно, не только наносятся медленными, но и очень неловкими, чтобы выразить. Рассмотрим также модель безопасности, которая предоставляет сотрудникам доступ к зданиям. Какой правильный способ выразить это? Должны ли сотрудники хранить коллекцию зданий, к которым они могут получить доступ, или должны хранить в зданиях коллекцию сотрудников, которые имеют к ним доступ? Более того, почему любой класс должен иметь коллекцию другого запеченного в его дизайне? И, какой бы вы ни выбрали, как бы вы спросили, какие пары сотрудников имеют более одного здания, к которому они могут получить доступ? Не существует простого навигационного шаблона, который может ответить на такой вопрос. Разумное решение-объект «доступа»-по сути, является возвращением обратно в правильно нормализованную реляционную схему, и для этого требуется какой-то вид языка запросов, который в значительной степени заимствует реляционную алгебру, чтобы ответить на вопрос без массивного. передача данных провода.

Также рассмотрите еще одну важную силу, рекламируемую для OODBMS: методы, особенно наследование виртуальными методами. Спортивная клиника может иметь разные показатели риска травм для разных видов спортсмена. В мире ORM это будет автоматически выражено как иерархия класса с Athlete в корне и виртуальный метод, int InjuryRiskScore() реализовано каждым производным классом. Проблема в том, что этот метод неизменно реализуется на клиенте, а не на заднем плане, поэтому, если вы хотите найти 10 спортсменов с самым высоким риском во всех видах спорта в вашей клинике, единственный способ сделать это - принести всех спортсменов по всему Проводите и пропустите их через приоритетную очередь на стороне клиента. Я также не знаю мир OODBMS, но я думаю, что возникает та же проблема, поскольку двигатели хранения обычно хранят достаточно данных только для регидрата объектов на языке программирования клиента. В реляционной модели или SQL вы выразили оценку риска травм в качестве мнения, что может быть просто союзом мнений в типе пера. Затем вы просто задаете вопрос. Или вы можете задать более сложные вопросы, такие как: «Кто имел наибольший рост в их риске травмы с момента осмотра прошлого месяца?» Или даже: «Какой показатель риска оказался лучшим предиктором травм за последний год?». Самое главное, что на эти вопросы можно ответить в СУБД, не более, чем вопрос и ответ, пройдя по проволоке.

Реляционная модель позволяет СУД выражать знания высоко дистиллированным образом на основе логики предиката, которая позволяет различным измерениям фактов, которые вы храните в нем, соединены, проецируются, фильтрованы, сгруппированы, суммированы и в противном случае переставили в совершенно споренном манера Это позволяет легко готовить данные таким образом, которые не ожидались, когда система была изначально разработана. Таким образом, реляционная модель допускает наиболее чистое выражение знаний, о котором мы знаем. Короче говоря, реляционная модель содержит чистые факты - не более того, ничего меньшего (и, конечно, не объектов или их доверенных лиц).


По историческому примечанию, реляционная модель появилась в ответ на катастрофическое положение дел с существующей сетью и иерархическими СУБД в том времени, и в значительной степени (и справедливо) вытеснила их для всех, кроме небольшой ниши областей применения (и даже эти, вероятно, они, вероятно, вытеснили их для всех, кроме небольших областей применения (и даже этих оставался в значительной степени потому, что SQL не смог обеспечить среднеквадратичную мощность). Глубоко иронично, что большая часть отрасли в настоящее время стремится к «старым добрым временам» теоретических баз данных сети, что, по сути, то, к чему возвращаются oodbmss и текущий урожай баз данных NOSQL. Эти усилия справедливо критикуют SQL за неспособность удовлетворить сегодняшние потребности, но, к сожалению, они предполагали (ошибочно и, вероятно, из-за чистого невежества), что SQL является выражением высокой точки зрения реляционной модели. Следовательно, они пренебрегли даже рассмотреть саму реляционную модель, которая практически не имеет ни одного из ограничений, которые отказались от многих от SQL, часто к OODBMSS.

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

ZODB позволяет вам сохранять модели данных почти полностью прозрачно.Его использование сводится к чему-то вроде:

 # 'Persistent' allows us to save things transparently
 class Car(Persistent):
   def set_wheels(number)
      self.wheels = number

 # 'database' is a ZODB database
 database.car = Car()
 database.car.set_wheels(3)

Вам придется долго искать, чтобы найти такую ​​читаемость с помощью RDMBS.В этом есть большой плюс использования ZODB в веб-приложении.

Большим недостатком, как подчеркивает Марчелло, является отсутствие мощных запросов.Отчасти это побочный эффект удобства приведенной выше идиомы.Следующее совершенно нормально, и все будет сохранено в базе данных:

 database.car.colour = "yellow"
 database.car.owner = "Trotter"
 database.car.neighbour = Car()

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

Итак, это зависит от того, что вы подразумеваете под «обычной веб-разработкой».Многим веб-сайтам на самом деле не требуются сложные многомерные запросы, и поиск в линейном времени вообще не представляет проблемы.В этих случаях использование СУБД, на мой взгляд, может слишком усложнить ваш код.Я написал множество приложений типа CMS, используя исключительно объектную базу данных.Многие CRUD здесь не особо важны;ZODB очень зрелый, хорошо масштабируется и кэшируется.

Однако, если вы пишете веб-приложение, которое должно составлять сложную бизнес-отчетность по образцу Google Analytics, или какую-то систему управления складскими запасами с большим количеством терабайт данных, то вам определенно понадобится СУБД.

Подводя итог, можно сказать, что объектная база данных может обеспечить удобочитаемость и удобство обслуживания за счет производительности сложных запросов.Конечно, читаемость — это вопрос мнения, и нельзя игнорировать тот факт, что гораздо больше разработчиков знают SQL, чем различные диалекты объектных баз данных.

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

Единственный раз, когда я буду снова использовать реляционную базу данных для веб -разработки, - это когда мне нужно подключиться к существующему.

Преимущества:

  • меньше кода, более быструю разработку;
  • намного лучшая масштабируемость;
  • может справиться с гораздо более сложными моделями;
  • Гораздо лучшая гибкость проекта;
  • Я упоминал гибкость;
  • может обрабатывать изменения в моделях классов, не только данных, но и кода;

Диспании:

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

Реляционная DB

  • SQL и стандарты
  • легко моделировать
  • может использовать только стандартные и типы поставщиков
  • ссылочная целостность (маточно твердое Теория реляционных наборов)
  • Много инструментов и реализаций базы данных
  • данные отдельно от программы
  • Управление хранением и поддержка инфраструктуры высокой класса
  • транзакции и управление параллелизмом выполнены в рамках
  • Реляционная модель основана на значении, IE строки идентифицируются первичными ключами

Минусы

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

Объект DB

  • Высокая производительность
  • Быстрее, поскольку не требуется соединения
  • Врожденный механизм управления версиями
  • Навигационный интерфейс для операций (например, обход графика)
  • Объектный запрос на язык получение объектов декларативно
  • Сложные типы данных
  • объект идентификация т.е. equals (), в котором идентичность объекта не зависит от значения и обновлений
  • облегчает совместное использование объектов
  • классы и иерархии (наследование и инкапсуляция)
  • Поддержка отношений
  • Интегрирован с языком настойчивости, таким как ODL
  • Поддержка атомности
  • Поддержка вложенных отношений
  • Семантическое моделирование

Минусы

  • Нет математической основы как RDB (см. CODD)
  • Минусы объектной ориентации
  • Постоянство труднее для сложных структур, некоторые данные должны быть временными

Объектно-релационные базы данных (Вы, возможно, видели UDTS!)

  • Поддержка сложных типов данных, таких как сбор, MultiSets и т. Д.
  • Объектно -ориентированное моделирование данных
  • расширенные SQL и богатые типы
  • Поддержка UDT Inhertance
  • мощный язык запросов

Различные подходы (OO, реляционный DB или OODB) могут быть необходимы для разных приложений

использованная литература

Преимущество использования реляционных баз данных для крупных корпораций

Реляционная база данных реляционная база данных

Oudms manifesto

ODMG

Преимущества реляционной базы данных

Объектно-ориентированный манифест системы баз данных

Объектно -ориентированные системы баз данных

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

Критерии полноты систем, реляционных баз данных,

Сравнения

http://en.wikipedia.org/wiki/comparison_of_relational_database_management_systems

http://en.wikipedia.org/wiki/comparison_of_object_database_management_systems

http://en.wikipedia.org/wiki/comparison_of_object-realational_database_management_systems

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

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

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

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

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

Я должен добавить, что если ваш БД, вероятно, будет довольно маленьким, производительность не будет серьезной проблемой. Но если производительность, на самом деле, является проблемой, у вас есть много вещей, о которых нужно беспокоиться о том, что только OO против реляционных DBS. (Просто чтобы выбрать один пример из реляционного мира DB, какую форму нормализации вы должны использовать? Это чрезвычайно важный и сложный вопрос. Вы поддерживаете операционную систему или хранилище данных? Знаете ли вы заранее, что некоторые запросы являются имеет первостепенное значение или незначительное значение? & c.)

Помимо вопроса о производительности БД и интеграции с вашей объектной моделью, есть и другие реальные вопросы. У вас есть ограничения Diskspace / Server / Bandwidth? Будете ли вы предложить лишь небольшое количество операций для пользователей веб -сайтов, или люди, которых вы даже не знаете, создают свои собственные запросы/редакторы?

Для других, более важных, реальных вопросов, с кем вы будете работать? Что они уже знают (или предпочитают)? И если у вас еще нет знаний о домене, может быть, у вас есть личное любопытство, толкающее вас в одном направлении? Если вы начинаете с личного проекта, следование собственным предпочтениям - лучшее руководство к успеху, чем беспокойство по поводу производительности, прежде чем вы даже начнете.

Если вы можете ответить на эти и похожие вопросы, даже если ответ «я не знаю», вы сможете получить гораздо лучшее направление в том, как продолжить.

В контракте с Марсело подробно и хорошо продуманным ответом, я бы сказал, что, основываясь на выражении вашего вопроса «регулярное веб -разработку», мой ответ от манжета будет состоит в том, чтобы сказать, что вам будет трудно найти достаточно профессионалов. Чтобы оправдать использование объекта DB в традиционном реляционном DB, для простого факта, который является большим количеством ресурсов/разработчиков/учебных пособий/и т. Д., Которые более знакомы с традиционной реляционной моделью, и как использовать это для достижения «регулярного веб -разработки».

Тем не менее, я думаю, что с некоторыми из современных орксов вы получаете немного лучших из обоих миров, потому что ваши основные данные хранятся в хорошо понятых РДБМ (это, вероятно, стабильно, поддерживается и т. Д.), Но вы можете Все еще абстрагируйте некоторые возможности моделирования объектов, которые могут (возможно, могут быть более подходящими для разработки приложений CRUD.

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

Надеюсь, это поможет!

Это в значительной степени объясняет плюсы и минусы:

http://en.wikipedia.org/wiki/object_database

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top