powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / SQL и ООП
25 сообщений из 195, страница 2 из 8
SQL и ООП
    #34604831
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за декларация, можно полюбопытствовать?
...
Рейтинг: 0 / 0
SQL и ООП
    #34604844
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneА что за декларация, можно полюбопытствовать?
Да та многократно цитированная фраза Страуструпа - мол, ездили беседовать с разработчиками ANSI SQL, долго думали, решили, что объекты ни фига с RDBMS не совместимы.
...
Рейтинг: 0 / 0
SQL и ООП
    #34604852
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал такое у Селко. У Стауструпа не помню.

В общем, фигня это всё.
...
Рейтинг: 0 / 0
SQL и ООП
    #34605647
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16 NafВыложил свои мысли по этому вопросу
http://mynaf.narod.ru/OQL.html
Прошу обсуждения


Мне не понравился (очень) один момент.
Зачем объеты таскаются целиком? Этоведь эквивалентно "SELECT *"

Я сейчас работаю над наложением объектной структуры на классическом MS SQL и пришел к нескольким выводам:
1. Объекты (ID) отдельно, атрибуты отдельно!
2. Чтение из базы объекта НЕ есть чтение ВСЕХ атрибутов.
3. Множество мелких скалярных запросов противопоставить одному большом селекту.

Обсудим?

1. Это поддерживается, например в Оракле. Например запрос:

Код: plaintext
select o, value(o) v from obj_table o

вернёт ссылку на объект o и его значение v.
Если прямо сейчас зачение объекта не требуется, то можно получить только ссылку, а позже разименовать эту ссылку в объект операцией deref.

2. Как вариант - ленивая инициализация. ИМХО, имеет смысл только для очень медленных каналов связи при том что каждый отдельный атрибут объекта занимает очень много места и долго передаётся по сети. Например, в оракле для LOB полей можно сначала загрузить из БД только локатор, а затем по мере надобности подгрузить сам LOB или вырезки из него.

3. Накладные расходы на выполнение SQL запроса как правило довольно велики, кроме того запросы

Код: plaintext
select a from t where id=:n
и
Код: plaintext
select b from t where id=:n

занимают на сервере БД практически вдвое больше места чем один запрос

Код: plaintext
select a, b from t where id=:n

учитывая, что в БД могут быть определены миллионы полей, СУБД просто загнётся разбирая миллионы SQL запросов.
...
Рейтинг: 0 / 0
SQL и ООП
    #34605835
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Иванов модТаблица - это просто массив в терминах ЯП, т.е одна переменная.
В СУБД есть понятия схем, подсхем, права доступа, view. Суррогат, но все же.

Хм. А разве не таблица - класс, а поля таблицы - переменные/свойства/поля класса? Единственно, что методов у таблицы нет своих собственных для работы со своими данными.

Есть понятия класс, объект и компонент.

Таблица БД имеет дуальную природу. С обной стороны это запись в словаре БД (спецификация класса реализации), с другой - файл на диске (артефакт, коллекция объектов). Запись в словаре БД определяет для СУБД интерфейс на уровне SQL запросов для доступа к объекту в сегменте таблицы.
СУБД является компонентом системы, который реализует поведение класов и объектов системы реализованных таблицами, триггерами и т.д..

Если взглянуть на инкапсуляцию шире, то фактичеки структура данных инкапсулирована, поскольку данные доступны только через API СУБД и SQL запросы. Изменить атрибут объекта мы можем только с помощью команды update и т.д. Триггеры - суть специализированные методы объектов, правда триггеры вызываются на выполнение рекурсивно, в процессе выполнения SQL запроса, а не явно, как обычные методы.

Ещё один аспект, это время доступа к данным на диске или даже в кэше СУБД. Поскольку это время гораздо больше, чем время доступа к объекту в оперативной памяти процессе, то чаще мы имеем дело с более-менее точными копиями объектов хранящихся в БД. А раз так, то нам никто не мешает обернуть эти копии соответствующим процедурным интерфейсом, тем самым скрыть от окружающих структуру хранимого объекта или повысить уровень абстракции.

По большому счёту, БД это средство асинхронных коммуникаций процессов, реализованное в виде файлов на диске. СУБД позволяет работать с этими файлами на следующем уровне абстракции, рассматривая их как набор таблиц, следующий уровень абстракции определяется Middleware, в частности объектным кэшем, который позволяет абстрагироваться от табличной организации данных и перейти к сетевой структуре, отказаться от SQL запросов в пользу навигации по объектным ссылкам. Следующий уровень - прикладной. Он позволяет наделить объекты некоторым дополнительным поведением, которое невозможно определить на предыдущих уровнях абстракции и скрыть структуру объекта от других объектов системы.
ИМХО, как со временем СУБД научились запускать триггеры, так же со времем СУБД или Middleware научатся реализовавывать процедурные интерфейсы объектов, Оракл сделал небольшой наг в эту сторону, к сожалению ограничившись PL/SQL, а пока пишите методы объектов в клиентских приложениях, WEB сервисах и хранимых процедурах.
...
Рейтинг: 0 / 0
SQL и ООП
    #34875189
Фотография Guennadi Vanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab Дмитрий16
Я сейчас работаю над наложением объектной структуры на классическом MS SQL и пришел к нескольким выводам:
1. Объекты (ID) отдельно, атрибуты отдельно!
2. Чтение из базы объекта НЕ есть чтение ВСЕХ атрибутов.
3. Множество мелких скалярных запросов противопоставить одному большом селекту.

Обсудим?

1. Это поддерживается, например в Оракле. Например запрос:

Код: plaintext
select o, value(o) v from obj_table o

вернёт ссылку на объект o и его значение v.
Если прямо сейчас зачение объекта не требуется, то можно получить только ссылку, а позже разименовать эту ссылку в объект операцией deref.

Из обшения с Дмитрием я знаю, что под
Дмитрий16"1. Объекты (ID) отдельно, атрибуты отдельно!"
он имел в виду держать все атрибуты в одной колонке типа sql_variant одной таблицы и идентификаторы объектов во второй таблице,
имея на всё-про-всё всегда 2 таблицы

Вот этот момент мне давно не даёт покоя:
А зачем 2 таблицы, а не одна?
...
Рейтинг: 0 / 0
SQL и ООП
    #34891657
Guror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer NafРезультатов пока нет. Одна теория пока
Это, уж простите, не теория. Это ближе к еще одной цитате:

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


Помогите как дать доступ к SQL серверу
...
Рейтинг: 0 / 0
SQL и ООП
    #34894213
OxOOFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте господа. Вот прочитал весь форум и ничего конкретного так и не нашел. Одна вода. Вот кто нибудь скажет конкретно и с как можно меньше философией, как оптимально создать структуру таблиц БД для хранения вот этих ООП классов:

Рассмотрим на примере понятия автомобиль:

................Автомобиль {Марка, Производитель, Объем двигателя}
..................../.......................................................\
...Легковой(Скорость набора 100 км в час)....Грузовой(Грузоподъемность)
......................................................................./................................\
............................................Самосвал(Объем кузова)....Контейнеровоз(Количество контейнеров)


Вот в ООП все гладко и красиво. А вот БД?
...
Рейтинг: 0 / 0
SQL и ООП
    #34894440
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxOOFCВот кто нибудь скажет конкретно и с как можно меньше философией, как оптимально создать структуру таблиц БД для хранения вот этих ООП классов:
Код: plaintext
create table ObjectOrientedGarbage (id integer, data xmltype);
...
Рейтинг: 0 / 0
SQL и ООП
    #34894696
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxOOFCЗдравствуйте господа. Вот прочитал весь форум и ничего конкретного так и не нашел. Одна вода. Вот кто нибудь скажет конкретно и с как можно меньше философией, как оптимально создать структуру таблиц БД для хранения вот этих ООП классов:

Рассмотрим на примере понятия автомобиль:

................Автомобиль {Марка, Производитель, Объем двигателя}
..................../.......................................................\
...Легковой(Скорость набора 100 км в час)....Грузовой(Грузоподъемность)
......................................................................./................................\
............................................Самосвал(Объем кузова)....Контейнеровоз(Количество контейнеров)


Вот в ООП все гладко и красиво. А вот БД?если хотим проектировать базы, забываем про ООП, курим внимательно Дейта "Введение в системы баз данных" и др., научаемся, проектируем, вспоминаем ООП
...
Рейтинг: 0 / 0
SQL и ООП
    #34894762
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxOOFC
................Автомобиль {Марка, Производитель, Объем двигателя}
..................../.......................................................\
...Легковой(Скорость набора 100 км в час)....Грузовой(Грузоподъемность)
......................................................................./................................\
............................................Самосвал(Объем кузова)....Контейнеровоз(Количество контейнеров)


Вот в ООП все гладко и красиво. А вот БД?
А в БД еще красивше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table auto (
Марка,
Производитель,
Объем двигателя
Скорость набора  100  км в час
Грузоподъемность
Объем кузова
Количество контейнеров
)
create view Автомобиль select {Марка, Производитель, Объем двигателя} from auto
ну и т.д.
зы создайте в своем ООП объект Автомобиль и подумайте что будет дальше
...
Рейтинг: 0 / 0
SQL и ООП
    #34895587
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю как минимум три способа представления наследования в РБД и каждый со своими недостатками.
1. Классично. Один класс = одна таблица. В таблице наследника - только дополнительные поля.
Недостатки: 1) Запрос со всеми аттрибутами класса получается путем соединения таблиц (привет производительность).
2. Практично. Один КОНКРЕТНЫЙ класс = одна таблица. Каждая таблица содержит все унаследованные поля.
Недостатки: 1) Связи, наследуемые от родительских классов превращаются в неразбериху из множества связей к разным таблицам. Фактически ссылочную целостность приходится обеспечивать ручками.
3. Готично. Втюхивание всех наследников в одну таблицу:
модА в БД еще красивше:
[src]
create table auto (
Марка,
Производитель,
Объем двигателя
Скорость набора 100 км в час
Грузоподъемность
Объем кузова
Количество контейнеров
Что тут красивого не пойму. Во-первых, количество контейнеров легковушке ни к чему. Во-вторых, нужно еще поле "Тип", чтобы хоть как-то отличить тягач от мопэда. И поэтому-же желаю веселых свитчей в коде обработчиков. Математическая модель, пространстово состояний, ограничения значений полей и функциональные зависимости у каждого класса на самом деле разные. И связи, если таковые имеются тоже.
...
Рейтинг: 0 / 0
SQL и ООП
    #34895602
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
модзы создайте в своем ООП объект Автомобиль и подумайте что будет дальшена то и абстрактные классы, чтоб от них объектов не производить.
...
Рейтинг: 0 / 0
SQL и ООП
    #34896185
OxOOFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо 12345678 за четкий ответ...
...
Рейтинг: 0 / 0
SQL и ООП
    #34896306
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345678на то и абстрактные классы, чтоб от них объектов не производить.
Ч.т.д. :)
...
Рейтинг: 0 / 0
SQL и ООП
    #34896310
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345678Что тут красивого не пойму.
В этом-то и беда (:
...
Рейтинг: 0 / 0
SQL и ООП
    #34896350
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мод 12345678Что тут красивого не пойму.
В этом-то и беда (:будет еще красивее, если у тягача появится связь с прицепом.
и ту же связь в вашей структуре получат все, вплоть до мопэда.
...
Рейтинг: 0 / 0
SQL и ООП
    #34896680
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё как минимум один способ - "велосипедно-изобретательно", EAV.

В самом простом виде:
Автомобиль {Идентификатор, Марка, Производитель, Объем двигателя, Тип}
Значение параметра автомобиля {Название, Значение, Идентификатор автомобиля}

В более сложном:
Тип автомобилей {...}
Автомобиль {...}
Тип параметров автомобиля {...}
Допустимое значение типа параметров автомобиля {...}
Значение параметра автомобиля {...}
Допустимые связи для типа автомобилей {...}
Связь между автомобилями {...}

12345678<...>3. Готично. Втюхивание всех наследников в одну таблицу:
модА в БД еще красивше:
[src]
create table auto (
Марка,
Производитель,
Объем двигателя
Скорость набора 100 км в час
Грузоподъемность
Объем кузова
Количество контейнеров
Что тут красивого не пойму. Во-первых, количество контейнеров легковушке ни к чему. Во-вторых, нужно еще поле "Тип", чтобы хоть как-то отличить тягач от мопэда. И поэтому-же желаю веселых свитчей в коде обработчиков.
Насчёт типа - согласен. А красота здесь - в прозрачности и воспринимаемости. Благодаря этим качествам работу с "готичной" структурой можно быстро реализовать, отладить, продать, и поддерживать легче других. Т.е. и сначала, и потом можно мало работать и много получать: кр-р-расота!

12345678Математическая модель, пространстово состояний, ограничения значений полей и функциональные зависимости у каждого класса на самом деле разные. И связи, если таковые имеются тоже.
Корректность заполнения полей можно поддерживать множеством способов, на разных уровнях системы. И от этой поддержки на практике, в отличие от теории, никуда не избавиться. Недостаточно просто написать в тетради что-нибудь наподобие:
...
Рейтинг: 0 / 0
SQL и ООП
    #34896700
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345678Я знаю как минимум три способа представления наследования в РБД и каждый со своими недостатками.
хм... надо же насколько у людей фантазия развита.
...
Рейтинг: 0 / 0
SQL и ООП
    #34896728
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345678 если у тягача появится связь с прицепом.
и ту же связь в вашей структуре получат все, вплоть до мопэда.
С чего бы это ?
...
Рейтинг: 0 / 0
SQL и ООП
    #34896750
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexTheRavenЕсть ещё как минимум один способ - "велосипедно-изобретательно", EAV.

Логически это то же самое, реализация другая.
Тип, вид, категория и пр. - это все поля той же таблицы - ссылки на соотв. классификаторы. От их значений зависит представление - внутр. и внешнее.
...
Рейтинг: 0 / 0
SQL и ООП
    #34896823
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в пределе вообще имеем БД из одной таблицы со всеми-всеми полями? красиво?

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

без обработчиков значений полей никогда не обойтись. но когда количество типов составляет несколько десятков, заставляет задуматься необходиомсть обновления их всех при добавлении нового типа, даже если правила, налагаемые на наследуемые поля такие же.
...
Рейтинг: 0 / 0
SQL и ООП
    #34897330
sandreynik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Классная тема. Сам не раз думал над этим. Microsoft попробовала решить эту проблему создав Repository. Он реализован в SQL2000. На счет наследования. Эта фича нужна тоько для повторно использования кода. КОДА. База данных предназначена для хранения данных. Если код у Вас это данные то и флаг в руки.
...
Рейтинг: 0 / 0
SQL и ООП
    #34897499
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OxOOFCкак оптимально создать структуру таблиц БД для хранения вот этих ООП классов:

Сама постановка вопроса некорректна. В БД не надо хранить классы. В БД (если речь про реляционные) хранятся отношения. Если вы не можете взглянуть на мир иначе, чем через призму ООП-шной модели, то это ваши проблемы, а не БД.
...
Рейтинг: 0 / 0
SQL и ООП
    #34897512
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov Andrey OxOOFCкак оптимально создать структуру таблиц БД для хранения вот этих ООП классов:

Сама постановка вопроса некорректна. В БД не надо хранить классы. В БД (если речь про реляционные) хранятся отношения. Если вы не можете взглянуть на мир иначе, чем через призму ООП-шной модели, то это ваши проблемы, а не БД.
+1
...
Рейтинг: 0 / 0
25 сообщений из 195, страница 2 из 8
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / SQL и ООП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]