Несоответствие объектно-реляционного импеданса — это набор трудностей между данными в реляционных хранилищах данных и данными в предметно-ориентированных объектных моделях. Системы управления реляционными базами данных (СУРБД) являются стандартным методом хранения данных в выделенной базе данных, в то время как объектно-ориентированное (ОО) программирование является методом по умолчанию для бизнес-ориентированного проектирования в языках программирования. Проблема заключается не в реляционных базах данных или ОО-программировании, а в концептуальной сложности сопоставления между двумя логическими моделями. Обе логические модели по-разному реализуются с использованием серверов баз данных, языков программирования, шаблонов проектирования или других технологий. Проблемы варьируются от приложений до масштабов предприятия, когда хранимые реляционные данные используются в предметно-ориентированных объектных моделях, и наоборот. Объектно-ориентированные хранилища данных могут обменять эту проблему на другие трудности реализации.
Термин «рассогласование импедансов» происходит от термина «согласование импедансов» в электротехнике .
Математически OO — это направленные графы , где объекты ссылаются друг на друга. Relational — это кортежи в таблицах с реляционной алгеброй . Кортежи — это поля данных, сгруппированные в «строку» с типизированными полями. Ссылки обратимы (INNER JOIN симметричен, чтобы следовать внешним ключам в обратном направлении), образуя ненаправленные графы .
Инкапсуляция объектов скрывает внутренности. Свойства объектов видны только через реализованные интерфейсы. Однако многие ORM выставляют свойства публично для работы со столбцами базы данных. Метапрограммирование ORM избегает нарушения инкапсуляции.
«Частное» против «публичного» в реляционном базируется на потребностях. В ОО оно абсолютно базируется на классах. Эта относительность против абсолютизма классификаций и характеристик сталкивается.
Объекты должны реализовывать интерфейсы для раскрытия внутренних данных. Реляционный использует представления для изменения перспектив и ограничений. Ему не хватает таких ОО-концепций, как классы , наследование и полиморфизм .
Для правильной работы ORM таблицы, связанные через отношения «внешний ключ / первичный ключ», должны быть сопоставлены с ассоциациями в объектно-ориентированном анализе .
Реляционный запрещает ссылки (например, указатели ), тогда как ОО принимает ссылки. Скалярные типы различаются между собой, что затрудняет отображение.
SQL поддерживает строки с максимальной длиной (быстрее, чем без) и сопоставления . В OO сопоставление есть только с процедурами сортировки , а строки ограничены только памятью. SQL обычно игнорирует конечные пробелы во время сравнения char , но библиотеки OO этого не делают. OO не создает новые типы с использованием ограничений на примитивы.
Объекты могут включать в себя другие объекты или специализироваться. Реляционный не вложен, и отношение ( кортежи с одинаковым заголовком) не вписывается в OO.
Реляционный использует декларативные ограничения на скалярные типы, атрибуты, переменные отношений и/или глобально. OO использует исключения, защищающие внутренние компоненты объектов.
Реляционный использует стандартизированные операторы для манипулирования данными, в то время как ОО использует per-class per-case императив . Любая ОО декларативная поддержка предназначена для списков и хэш-таблиц , отличных от множеств в реляционном. [ необходима цитата ]
Единицей реляционного является транзакция , которая превосходит любые методы класса OO. Транзакции включают произвольные комбинации манипуляций данными, тогда как OO имеет только индивидуальные назначения примитивным полям. OO не хватает изоляции и долговечности, поэтому атомарность и согласованность есть только у примитивов.
Решения начинаются с распознавания различий между логическими системами. Это минимизирует или компенсирует несоответствие. [1]
Существуют объектные базы данных (OODBMS), позволяющие избежать несоответствия, но они менее успешны, чем реляционные базы данных. OO — плохая основа для схем. [4] Будущие исследования OO-баз данных включают транзакционную память .
Другое решение накладывает уровни на домен и логику фреймворка. Здесь OO отображает реляционные аспекты во время выполнения, а не статически. Фреймворки имеют класс кортежа (также называемый строкой или сущностью) и класс отношения (он же набор данных).
Смешивание ОО-уровней дискурса проблематично. В основном поддержка фреймворка компенсирует это, автоматизируя манипуляцию данными и шаблоны представления на уровне моделирования. Используются рефлексия и генерация кода . Рефлексия рассматривает код как данные, чтобы обеспечить автоматическую передачу данных, представление и целостность. Генерация превращает схемы в классы и помощников. Оба имеют аномалии между уровнями, где сгенерированные классы имеют как свойства домена (например, Имя, Адрес, Телефон), так и свойства фреймворка (например, IsModified).
Хотя несоответствия объектно-реляционного импеданса могут возникать при объектно-ориентированном программировании в целом, особую сложность представляют объектно-реляционные преобразователи (ORM). [5] Поскольку ORM часто определяется в терминах конфигурации, аннотаций и ограниченных предметно-ориентированных языков , ему не хватает гибкости полноценного языка программирования для устранения несоответствия импеданса.
Кристофер Дж. Дейт говорит, что настоящая реляционная СУБД решает эту проблему, [6] [7] [8] поскольку домены и классы эквивалентны. Сопоставление реляционного и ОО является ошибкой. [9] Реляционные кортежи связывают, а не представляют сущности. Роль ОО сводится только к управлению полями.
Объекты домена и пользовательские интерфейсы имеют несоответствующие импедансы. Продуктивные пользовательские интерфейсы должны предотвращать незаконные транзакции ( нарушения ограничений базы данных ), чтобы помочь операторам и другим непрограммистам управлять данными. Для этого требуются знания об атрибутах базы данных за пределами имени и типа, что дублирует логику в реляционных схемах.
Фреймворки используют ограничения ссылочной целостности и другую информацию о схеме для стандартизации обработки, исключая необходимость написания кода для каждого конкретного случая.
SQL , не имеющий доменных типов, затрудняет OO-моделирование. [ спорный – обсудить ] Это приводит к потерям между СУБД и приложением (OO или нет). Однако многие избегают NoSQL и альтернативных языков запросов, специфичных для поставщиков. СУБД также игнорируют Business System 12 и Tutorial D.
Основные СУБД, такие как Oracle и Microsoft SQL Server, решают эту проблему. OO-код (Java и .NET соответственно) расширяет их и вызывается в SQL так же свободно, как если бы он был встроен в СУБД. Повторное использование библиотечных процедур в нескольких схемах является поддерживаемой современной парадигмой.
OO находится в бэкэнде, потому что SQL никогда не получит современные библиотеки и структуры для сегодняшних программистов, несмотря на то, что комитет ISO SQL-99 хочет добавить процедурные. Разумно использовать их напрямую, а не изменять SQL. Это размывает разделение ответственности между «программированием приложений» и «администрированием баз данных», потому что реализация ограничений и триггеров теперь требует как навыков DBA, так и навыков OO.
Это утверждение может быть спорным. СУРБД не предназначены для моделирования. SQL приводит к потерям только при злоупотреблении моделированием. SQL предназначен для запросов, сортировки, фильтрации и хранения больших данных. OO в бэкэнде способствует плохой архитектуре, поскольку бизнес-логика не должна находиться на уровне данных.
Реляционный подход говорит, что СУБД является авторитетной, а объекты ОО-программы являются временными копиями (возможно устаревшими, если база данных изменяется одновременно). ОО-подход говорит, что объекты являются авторитетными, а СУБД служит только для сохранения.
Новые функции изменяют и код, и схемы. Схема — это ответственность администратора баз данных. Администраторы баз данных отвечают за надежность, поэтому они отказываются от ненужных изменений программистов. Подготовительные базы данных помогают, но просто отодвигают одобрение на время релиза. Администраторы баз данных хотят содержать изменения в коде, где дефекты менее катастрофичны.
Большее сотрудничество решает эту проблему. Решения об изменении схемы должны исходить из потребностей бизнеса. Новые данные или повышение производительности изменяют схему.
Существуют ключевые философские различия:
Поэтому сторонники утверждают, что от технологий других следует отказаться. [10] Некоторые администраторы баз данных РСУБД даже отстаивают процедурный подход по сравнению с ОО, а именно, что объекты не должны переживать транзакции. ОО парирует тем, что технология ООСУБД должна быть разработана для замены реляционного подхода. Однако большинство программистов воздерживаются и рассматривают несоответствие объектно-реляционного импеданса как просто препятствие.
ORM ситуативно предлагают преимущества. Скептики ссылаются на недостатки и малую ценность при слепом применении. [11]
по-видимому, неотличим от типа, как этот термин понимается в классическом смысле..
...любое такое сближение должно прочно основываться на реляционной модели.
Первая большая ошибка