1. Оставление.
Разработчики просто полностью отказываются от объектов и возвращаются к модели программирования, которая не создает несоответствия между объектами и реляционным импедансом. Хотя это неприятно, в определенных сценариях объектно-ориентированный подход создает больше накладных расходов, чем экономит, а окупаемость инвестиций просто не позволяет оправдать затраты на создание модели с расширенным доменом. ([Фаулер] говорит об этом немного глубже.) Это решает проблему довольно аккуратно, потому что, если нет объектов, нет и несоответствия импеданса.
2. Искреннее принятие.
Разработчики просто полностью отказываются от реляционного хранилища и используют модель хранилища, которая соответствует тому, как их языки смотрят на мир. Системы хранения объектов, такие как проект db4o, решают проблему аккуратно, сохраняя объекты непосредственно на диске, устраняя многие (но не все) из вышеупомянутых проблем; например, «второй схемы» не существует, поскольку единственной используемой схемой является схема самих определений объектов. В то время как многие администраторы баз данных упадут в обморок от этой мысли, в мире, который все больше ориентируется на сервис, который отказывается от идеи прямого доступа к данным, но вместо этого требует, чтобы весь доступ проходил через сервисный шлюз, таким образом инкапсулируя механизм хранения от любопытных глаз, он становится полностью Можно представить, что разработчики хранят данные в форме, которую им гораздо проще использовать, чем администраторам баз данных.
3. Ручное картирование.
Разработчики просто признают, что в конце концов это не так сложно решить вручную, и пишут прямой код реляционного доступа, чтобы возвращать отношения к языку, получать доступ к кортежам и заполнять объекты по мере необходимости. Во многих случаях этот код может даже автоматически генерироваться инструментом, исследующим метаданные базы данных, что устраняет некоторые основные критические замечания этого подхода (а именно: «Это слишком много кода для написания и поддержки»).
4. Принятие ограничений O / R-M.
Разработчики просто признают, что не существует способа эффективно и легко замкнуть цикл при несовпадении O / R, и используют O / RM для решения 80% (или 50%, или 95%, или любого процента, который кажется подходящим) проблема и использовать SQL и реляционный доступ (такой как «сырой» JDBC или ADO.NET), чтобы перенести их в те области, где O / RM может создать проблемы. Однако это несет свою долю риска, поскольку разработчики, использующие O / RM, должны знать о любом кэшировании решения O / RM внутри него, поскольку «сырой» реляционный доступ явно не сможет воспользоваться преимуществами этот слой кэширования.
5. Интеграция реляционных понятий в языки.
Разработчики просто признают, что это проблема, которая должна решаться языком, а не библиотекой или структурой. В течение последнего десятилетия акцент на решениях проблемы O / R был сосредоточен на попытках приблизить объекты к базе данных, чтобы разработчики могли сосредоточиться исключительно на программировании в одной парадигме (эта парадигма, конечно, является объектами). ). Однако в последние несколько лет интерес к языкам «сценариев» с гораздо более сильной поддержкой наборов и списков, таким как Ruby, породил идею о том, что, возможно, уместно другое решение: принести реляционные концепции (которые, в основе своей, основаны на наборах) в основные языки программирования, упрощая преодоление разрыва между «множествами» и «объектами». Работа в этом пространстве до сих пор была ограничена, в основном ограничена исследовательскими проектами и / или «незначительными» языками, но в сообществе появляется несколько интересных усилий, таких как функционально-объектные гибридные языки, такие как Scala или F #, а также прямые интеграция в традиционные языки OO, , такие как проект LINQ от Microsoft для C # и Visual Basic . К сожалению, одной из таких попыток была неудачная стратегия SQL / J; даже в этом случае подход был ограничен: он не пытался включить наборы в Java, а просто позволял выполнять предварительную обработку встроенных вызовов SQL и переводить их в код JDBC с помощью переводчика.
6. Интеграция реляционных понятий в рамки.
Разработчики просто признают, что эта проблема разрешима, но только с изменением перспективы. Вместо того чтобы полагаться на разработчиков языка или библиотеки для решения этой проблемы, разработчики придерживаются иного взгляда на «объекты», которые являются более реляционными по своей природе, создавая доменные структуры, которые более непосредственно построены вокруг реляционных конструкций. Например, вместо создания класса Person, который хранит свои данные экземпляра непосредственно в полях внутри объекта, разработчики создают класс Person, который хранит свои данные экземпляра в экземпляре RowSet (Java) или DataSet (C #), который может быть собран с другими RowSets / DataSets в простой в отправке блок данных для обновления базы данных или распаковки из базы данных в отдельные объекты.