Помогите мне связать наследование и реляционные понятия - PullRequest
7 голосов
/ 27 августа 2009

Я говорил с моим приятелем-программистом о наследовании и его использовании при проектировании моделей. Он большой сторонник, а я немного прохладнее. Главным образом потому, что я склонен проектировать системы снизу вверх: База данных -> Приложение -> Презентация (честно говоря, я не очень интересный человек, поэтому часто оставляю презентацию целиком кому-то другому). Я считаю, что системы реляционных баз данных не поддерживают наследование без большого количества взаимно однозначных связей с другими таблицами.

Если я проектирую с концептуальной точки зрения, Администратор - это Пользователь, это Персона. Начиная с базы данных, администратор - это пользователь с UserType = "Administrator". Согласование этих подходов мне кажется трудным, и поэтому я использую наследование только с непостоянными объектами.

Что не так с моим мышлением? Почему наследование является таким часто прославляемым аспектом ОО, если оно имеет эти врожденные несовместимости с традиционными реляционными структурами? Или я не правильно сопоставляю наследование с реляционными данными? Есть какое-нибудь руководство, которое могло бы прояснить это для меня?

Извините за бессвязный вопрос и заранее спасибо за ваши ответы. Если вы включите код в свой ответ, C # - мой «родной язык».

Ответы [ 11 ]

5 голосов
/ 27 августа 2009

Это обычно называют Несоответствие объектно-реляционного импеданса :

Наследование схемы - Большинство реляционных баз данных не поддерживают наследование схемы. Хотя такую ​​функцию теоретически можно добавить, чтобы уменьшить конфликт с ООП, сторонники реляционных отношений с меньшей вероятностью будут верить в полезность иерархических таксономий и подтипов, поскольку они склонны рассматривать таксономии на основе множеств или системы классификации как более мощные и гибкие. чем деревья. Сторонники ОО указывают, что модели наследования / подтипирования не обязательно должны быть ограничены деревьями (хотя это является ограничением во многих популярных языках ОО, таких как Java), но не-древовидные ОО-решения рассматриваются как более трудные для формулировки, чем вариации на основе множеств методы управления по теме предпочтительнее реляционных. По крайней мере, они отличаются от методов, обычно используемых в реляционной алгебре.

См. Также: Agile Data , C2 Wiki

3 голосов
/ 27 августа 2009

Я бы сказал, что модель наследования в этом вопросе неверна. Это слишком буквально или основано на реальном мире. Да, можно утверждать, что я являюсь администратором в реальном мире, и поэтому администратор является человеком. Тем не менее, объектный дизайн и наследование должны основываться больше на выраженном и общем поведении в пространстве кода. Я бы пошел больше по пути, по которому у пользователя есть роль. Администратор - это роль или экземпляр роли, для которой задано определенное состояние. Пользователь не является персоной (например, для вашей пакетной работы может потребоваться учетная запись пользователя).

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

3 голосов
/ 27 августа 2009

Часто обсуждается разрыв между реляционной парадигмой и ОО-парадигмой.

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

Обе парадигмы очень мощные и полезные. Но попытка легко сопоставить их - нерешенная проблема.

3 голосов
/ 27 августа 2009

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

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

Здесь вы найдете учебник по этому типу вещей.

1 голос
/ 27 августа 2009

Почему наследование такое часто прославляемый аспект ОО, если он имеет эти присущие несовместимости с традиционные реляционные структуры?

Это любопытная цитата - почему вы говорите, что реляционные структуры являются "традиционными"? По своей природе они являются нормой в СУБД, но я видел очень мало реляционных библиотек в контексте языка без БД.

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

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

1 голос
/ 27 августа 2009

Существуют различные виды наследования. Разработчики могут думать с точки зрения интерфейсов и поведения.

В вашем мире, что значит иметь "userType" администратора?

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

В этом случае разработчик может иметь класс User

class User() { viewData(){ ...} ; signReport() {...} }

и администратор класса с дополнительной возможностью

class Administrator()  extends User {  createUser() {...}; approvePurchase() {...} }

Объект типа Администратор может использоваться везде, где может использовать Пользователь. Это полиморфное поведение может быть полезным при реализации. Теперь ваша база данных вполне правдоподобно поддерживает этот случай. Однако что вы будете делать, когда администраторам понадобятся немного дополнительных данных для выполнения их конкретной задачи? Например, параметр purchaseApproval () имеет ограничение до определенного предела, этот предел нам нужен как новое поле, но он применяется только к администраторам.

Я считаю, что поведенческие аспекты, подразумеваемые вашей «типовой» концепцией, довольно часто связаны с дополнительными данными.

1 голос
/ 27 августа 2009

Есть много способов выразить такие отношения в C #. Реляционные базы данных просто более ограничены (что может быть как преимуществом, так и недостатком). Когда вы разрабатываете иерархию объектов, которая будет сохраняться в базе данных, я обнаружил, что обычно сначала проще начать со схемы базы данных, поскольку практически любую схему базы данных можно легко сопоставить с отношениями объектов, тогда как обратное не обязательно дело.

В этом конкретном случае вы можете смоделировать Администратора с композицией. Ваша таблица администраторов будет содержать любое дополнительное состояние администратора плюс ключ соответствующего пользователя. Пользователи FK также будут вашими администраторами PK.

0 голосов
/ 27 августа 2009

Hibernate упрощает наследование. Пример * +1003 *

0 голосов
/ 27 августа 2009

Ваш конкретный пример того, как Admininstrator является пользователем с типом пользователя «Administrator», является ярким примером шаблона «Наследование отдельных таблиц» . Это реализовано в некоторых основных ORM. В частности "Rails ActiveRecord" и Hibernate.

0 голосов
/ 27 августа 2009

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

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

Поскольку вы являетесь разработчиком на C #, вам, вероятно, стоит начать с изучения следующих двух проектов, один из которых поставляется с последним пакетом обновления .NET.

ADO.NET Entity Framework:

http://msdn.microsoft.com/en-us/library/bb386876.aspx

NHibernate:

http://nhforge.org/Default.aspx

...