ОО и SQL - PullRequest
       32

ОО и SQL

1 голос
/ 19 июля 2009

При попытке понять корреляцию между объектами программы и данными в таблицах (здесь: ОО-программа и база данных SQL ), которые я до сих пор не совсем понимаю, была выявлена ​​сильная разница во мнениях относительно того, можно использовать базу данных SQL для хранения данных для ОО-программы.

  1. Для нового программиста это нормально / рекомендуется или нет?

  2. Если нет, является ли альтернатива ОО-программе процедурной программой?

Также я не понимаю Несоответствие объектно-реляционного импеданса , это то, что люди имеют в виду , когда говорят, что "не нормально использовать SQL" БД для хранения данных для ОО-программы ": может кто-то резюмирует это, или есть простой пример, который иллюстрирует это?

Ответы [ 7 ]

3 голосов
/ 19 июля 2009

Для нового программиста это нормально / рекомендуется или нет?

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

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

Факты:

  • ОО часто является хорошим способом разработки программного обеспечения
  • БД SQL часто являются хорошим способом хранения данных
  • Проектирование отображения из SQL в OO может быть нетривиальным

Если нет, является ли альтернатива ОО-программе процедурной программой?

Ну, может быть, да: одна из особенностей ОО - это создание подклассов, а подклассы / наследование - это одна из проблем, которую проблематично моделировать / хранить в базе данных SQL.

Например, учитывая OOD как это ...

class Animal
{
  int id;
  string name;
  abstract void eat();
  abstract void breed();
}

class Dog : Animal
{
  bool pedigree;
  override void eat() {...}
  override void breed() {...}
}

class Bird : Animal
{
  bool carnivore;
  int numberOfEggs;
  void fly() {...}
  override void eat() {...}
  override void breed() {...}
}

... неясно, хранить ли эти данные, используя 2 таблицы SQL или 3. Принимая во внимание, что если вы уберете подклассы:

class Dog
{
  int id;
  string name;
  bool pedigree;
  void eat() {...}
  void breed() {...}
}

class Bird
{
  int id;
  string name;
  bool carnivore;
  int numberOfEggs;

  void fly() {...}
  void eat() {...}
  void breed() {...}
}

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

Также я не понимаю несоответствие объектно-реляционного сопротивления

Вот статья, которая длиннее и известнее, чем статья в Википедии; может быть, это легче понять: Вьетнам компьютерных наук

Обратите внимание, что одно из решений , которое предлагает проблему, это:

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

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

2 голосов
/ 19 июля 2009

Одна проблема с наличием одного класса = одной таблицы - это проблема нормализации.Есть также отношения между классами, которые не легко отображаются один на один.Поэтому я рекомендую: при проектировании базы данных сделать правильную схему;при выполнении объектно-ориентированного проектирования сделайте это без какой-либо зависимости от БД (следовательно, БД может быть XML, плоскими файлами или даже массивом с ручным кодированием), а затем напишите другой класс, который будет получать значения избаза данных, которую вы выбрали.

2 голосов
/ 19 июля 2009

Я бы сказал, что если все в порядке, то можно использовать базу данных SQL для хранения данных для объектно-ориентированной программы (я делаю это почти все время - и она работает вполне нормально)

Процедурные и объектно-ориентированные довольно спорны; Я не думаю, что вы должны выбирать в зависимости от типа хранилища, которое вы используете: выбор должен быть больше о вашем коде и вашем приложении.

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

1 голос
/ 19 июля 2009

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

Тем не менее, это все еще некоторые проблемы. Главное, IMHO, заключается в том, что дизайнеры / архитекторы хотят, чтобы бизнес-классы отображали 1-1 в таблицы БД, а они просто нет. Он начинается достаточно хорошо в высокоуровневом проектировании, но реальная проблема заключается в том, что вы пытаетесь реализовать подклассы: он просто не очень хорошо сопоставляется с SQL и реляционными понятиями.

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

В результате вы МОЖЕТЕ сделать это, и вы ДОЛЖНЫ сделать это, действительно, многие из нас ДОЛЖНЫ сделать это, но в середине определенно есть некоторые грязные части.

0 голосов
/ 20 июля 2009

Крис В. отлично ответил, один из лучших, которые я читал на эту тему. Я просто хочу добавить два моих цента об одном аспекте: проблема выражения подклассов в дизайне таблиц SQL.

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

0 голосов
/ 20 июля 2009

Крису У.,

Это Крис (задающий этот вопрос). Я предполагаю, что моя перезагрузка убила куки, которые сайт использовал, чтобы запомнить меня как автора этого вопроса. (и я не смогу комментировать сейчас, пока я не получу 50 баллов снова, я думаю)

В ответ на ваш последний комментарий ко мне, я понимаю, что вы говорите о проверке типов во время компиляции и о том, что в SQL нет такой роскоши. Вы считаете, что картографирование вручную не имеет такой «проверяющей» роскоши, как использование картографа? Можете ли вы использовать маппер, а затем вручную отображать в той же программе, если / когда это необходимо? Еще раз спасибо за вашу помощь!

0 голосов
/ 19 июля 2009

Базы данных SQL являются реляционными базами данных. В настоящее время реляционные базы данных занимают центральное место в области хранения и поиска данных (включая программные объекты), за исключением перемещения noSQL, которое имеет дело главным образом с чрезвычайно большими наборами данных.

Чтобы помочь в процессе перевода между объектами и реляционными таблицами, большинство программистов используют какой-то объект Object Relational Mapper, например Linq to SQL или nHibernate. Это значительно уменьшает требуемое усилие.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...