|
|
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
2Автор Хм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"? Вот мне кажется. Потому что при этом нарушается принцип скажем так "атомарности" объекта. Объект имеет определенное состояние, и это состояние должно быть целостным, т.е. нельзя загрузить объект частично. На мой взгляд, оптимальным представляется два вида загрузки объектов - "только ключ (ОИД)", и "Объект целиком". При этом, под "Объект целиком" предполагается, что загружаются также и ссылки разных видов (1-много, 1-1, много-много). (Вопросы оптимизации такой загрузки не рассматриваю, их можно загрузить "отложенно", при запросе). Второй аспект OQL более фундаментален, хоть и связан с тем же свойством "атомарности" объектов. В СУБД "атомарность" (это не атомарность транзакций) поддерживается на уровне хранения данных. Запись в таблице - это запись в таблице, набор значений, строго определенный и удовлетовлетворяющих определенным ограничениям. В то же время, эта атомарность пропадает на уровне выборки данных, данные - это просто данные, и клиенту, который запросил у СУБД выборку ничего не известно о том, как эти данные получены - вычислила ли их СУБД, или взяла из таблицы, или же еще как-то получила. В этом заключается основа, парадигма СУБД. Для объектных систем такое не пройдет. "Просто данных" в них нет. В них есть только "Данные объекта". Поэтому выборка из Объектной базы данных должна возвращать некоторую комбинацию ОБЪЕКТОВ. Здесь я вижу три решения - возвращать комбинацию из объектов существующих классов, или же конструировать новый класс. Или же смешать эти два решения, и вернуть комбинацию объектов + некоторые "вычисленные" данные. Итак, я пока вижу несколько требований к ОКЛ Выбираются только объекты целиком Любая выборка представляет собой набор объектов Любые агрегаты, вычисляемые поля и т.п. висят отдельно и непонятно где. Фактически, для ОКЛ сохраняется нету части SELECT [FieldList]. Есть только FROM и WHERE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 14:45 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
Аналогично, в ОКЛ по идее не должно быть ИНСЕРТОВ, АПДЕЙТОВ и ДЕЛЕТОВ в явном виде, это, опять же, обусловленно "атомарностью" объектов. С наследованием, в концептуальной части, я проблем как раз и не вижу. Пишем, к примеру, SELECT FROM BaseCar WHERE Vendor = "BMW" и получаем список из всех унаследованных классов. Если указать в части FROM наследника BaseCar, например, HighEndCar, выборка идет только по наследникам. Насчет ДЖОЙОВ тоже тот еще вопрос. По идее, ДЖОЙНОВ быть не должно, если отношения в ООСУБД задаются в виде ссылок. Джойны применять можно только для объединения классов по значениям полей, но не по ссылкам. Проблемы при выборке могут вызывать побочные эффекты аксессоров - когда получение значения одного поля изменяет значение другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 14:55 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
Sergey TokarevХм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"? Нет. Sergey TokarevВот мне кажется. Потому что при этом нарушается принцип скажем так "атомарности" объекта. А кто его сформулировал и чем он хорош? Sergey TokarevОбъект имеет определенное состояние, и это состояние должно быть целостным, т.е. нельзя загрузить объект частично. На мой взгляд, оптимальным представляется два вида загрузки объектов - "только ключ (ОИД)", и "Объект целиком". Угу. И поехала стандартная бодяга, показывающая безнадежность ОО-модели для данных. Я люблю приводить примером форум: допустим, Вы ходите вывести страничку топиков, указав для каждого топика время последнего сообщения и общее количество сообщений в топике. Дык вот: в этом случае Вы предлагаете не много ни мало, как грузить все топики целиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 15:08 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
Sergey Tokarev Хм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"? Может быть компьютер способен на основе статистики предсказать, какие поля скорее понадобятся и загрузить только их. А остальные подгружать по мере необходимости. Причем хинтом можно подсказать, какие грузить строго, а какие - лениво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 15:12 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
Sergey Tokarev Хм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"? Вот мне кажется. Потому что при этом нарушается принцип скажем так "атомарности" объекта. Объект имеет определенное состояние, и это состояние должно быть целостным, т.е. нельзя загрузить объект частично. ??? "а почему, собственно" ООП мнит себя описанием реального мира в терминах, естественных для такового описания. объекты же реального мира (как правило) сколь угодно уточняемы (детализируемы). И степень (необходимой нам в некоем рассмотрении) детализации явно зависит от контекста рассмотрения. Т.е. напротив желательно, чтобы для рассмотрении в "легком" контексте не строился тяжеловесный "объект" весь, "целиком" (т.е. в форме, рассчитанной на самый "тяжелый" из заранее предусмотренных контекстов). Так мы приходим к идее реализации контоекстно-зависимых "представлений" (видов) "объектов" в ООП (и в отказе от называния любого экземпляра "т.н. классов" собственно объектом, но - реализацией более или менее глубоко проработанного "представления" т.е. объекты остаются в области идеального (т.е. в модели), а реализуемы только представления. как и должно быть.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 15:15 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
softwarer .... Угу. И поехала стандартная бодяга, показывающая безнадежность ОО-модели для данных. Я люблю приводить примером форум: допустим, Вы ходите вывести страничку топиков, указав для каждого топика время последнего сообщения и общее количество сообщений в топике. Дык вот: в этом случае Вы предлагаете не много ни мало, как грузить все топики целиком. а) Я не предлагаю. Я размышляю, что таки для "ОО-модели" придеться грузить. Или хотя бы делать вид, что грузить, физически можно и не загружать данные. б) Я не агитирую за "ОО-модель для данных". И сам прекрасно понимаю ее недостатки. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. такой вот пример класса. Код: plaintext 1. 2. 3. 4. 5. Так вот, эти два запроса вернут один и тот же экземпляр класса, по идее, только в одном случае кол-во сообщений будет 0, а в другом - будет реальное количество сообщений. Поэтому явное указание списка полей для выборки может повлечь за собой то, что экземпляры класса будут иметь разные значения полей. Вот и все, что я имел ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 15:22 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
sandreynikКлассная тема. Сам не раз думал над этим. Microsoft попробовала решить эту проблему создав Repository. Он реализован в SQL2000. На счет наследования. Эта фича нужна тоько для повторно использования кода. КОДА. База данных предназначена для хранения данных. Если код у Вас это данные то и флаг в руки.В том то и дело, что наследование кода в отрыве от наследования структур данных, с которым ему работать, - это полумера. За соответствием одного другому надо следить глазками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 15:34 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
softwarer Sergey TokarevХм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"? Нет. Sergey TokarevВот мне кажется. Потому что при этом нарушается принцип скажем так "атомарности" объекта. А кто его сформулировал и чем он хорош? Sergey TokarevОбъект имеет определенное состояние, и это состояние должно быть целостным, т.е. нельзя загрузить объект частично. На мой взгляд, оптимальным представляется два вида загрузки объектов - "только ключ (ОИД)", и "Объект целиком". Угу. И поехала стандартная бодяга, показывающая безнадежность ОО-модели для данных. Я люблю приводить примером форум: допустим, Вы ходите вывести страничку топиков, указав для каждого топика время последнего сообщения и общее количество сообщений в топике. Дык вот: в этом случае Вы предлагаете не много ни мало, как грузить все топики целиком. Нет проблем.Если следовать ООП здесь объектная модель должна иметь объект КоллекцияТопиков который Должна имеет метод GetPropertiesTopics(TimeLastVisit, AmountMessage ...). Вы получаете все свойства по всем объекта в коллекции. Не вижу противоречий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 16:35 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
12345678 sandreynikКлассная тема. Сам не раз думал над этим. Microsoft попробовала решить эту проблему создав Repository. Он реализован в SQL2000. На счет наследования. Эта фича нужна тоько для повторно использования кода. КОДА. База данных предназначена для хранения данных. Если код у Вас это данные то и флаг в руки.В том то и дело, что наследование кода в отрыве от наследования структур данных, с которым ему работать, - это полумера. За соответствием одного другому надо следить глазками. Нормальная практика когда объект имеет метод или интерфейс Persistance. Вот он пусть и следит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 16:37 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
sandreynik 12345678 sandreynikКлассная тема. Сам не раз думал над этим. Microsoft попробовала решить эту проблему создав Repository. Он реализован в SQL2000. На счет наследования. Эта фича нужна тоько для повторно использования кода. КОДА. База данных предназначена для хранения данных. Если код у Вас это данные то и флаг в руки.В том то и дело, что наследование кода в отрыве от наследования структур данных, с которым ему работать, - это полумера. За соответствием одного другому надо следить глазками. Нормальная практика когда объект имеет метод или интерфейс Persistance. Вот он пусть и следит.вообще-то за этим должен следить компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 17:06 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
12345678 sandreynik 12345678 sandreynikКлассная тема. Сам не раз думал над этим. Microsoft попробовала решить эту проблему создав Repository. Он реализован в SQL2000. На счет наследования. Эта фича нужна тоько для повторно использования кода. КОДА. База данных предназначена для хранения данных. Если код у Вас это данные то и флаг в руки.В том то и дело, что наследование кода в отрыве от наследования структур данных, с которым ему работать, - это полумера. За соответствием одного другому надо следить глазками. Нормальная практика когда объект имеет метод или интерфейс Persistance. Вот он пусть и следит.вообще-то за этим должен следить компилятор. Компилятор следит за тем что декларировано в синтаксисе языка. Значит просто надо написать другой компилятор для другого языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 17:22 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
sandreynikКомпилятор следит за тем что декларировано в синтаксисе языка. Значит просто надо написать другой компилятор для другого языка.это который будет сам генерировать структуру данных для описанных классов? к чему же это мы пришли?))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 17:44 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
Sergey Tokarev2Автор Хм, а вам не кажется странным выражение вида "выбрать поле1, поле2 .. полеН из таблицы бла"?В самом ООП один объект запрашивает у другого значения свойств 1, 2 ... N, а не "объект целиком". И нет никакого нарушения целостности ибо свойства только читаютя. Вот если бы они измененялись без проверки методами доступа - было бы нарушение целостности. Действительно типичный пример, когда ООП понимают неправильно и пихают не туда куда надо. Зачем клиенту запрашивать сами сами объекты с сервера, если он может работать с ними через свойства и методы? Если же каждому серверному объекту сопоставлен клиентский - то их личное дело, какими данными и через что они обмениваются. Можно и через самый примитивный SQL, если серверные объекты прикручены триггерами к данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 19:32 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
softwarer U-geneА что за декларация, можно полюбопытствовать? Да та многократно цитированная фраза Страуструпа - мол, ездили беседовать с разработчиками ANSI SQL, долго думали, решили, что объекты ни фига с RDBMS не совместимы. У Селко /topic/374405&pg=9#4259111 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2007, 04:36 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
модТе же грабли отношение1=отношение2 операция отношение3 - работает объект1=объект2 операция объект3 - просто чушь An Imperative Object Calculus. Martin Abadi And Luca Cardelli, Towards Object - Oriented Refinement Calculus, Jamie Shield Object - Oriented Programming in Explicit Mathematics: Towards The Mathematics of Objects, Thomas Studer von Werthenstein и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2007, 04:41 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
tchingizAn Imperative Object Calculus. Martin Abadi And Luca Cardelli, Towards Object - Oriented Refinement Calculus, Jamie Shield Object - Oriented Programming in Explicit Mathematics: Towards The Mathematics of Objects, Thomas Studer von Werthenstein и т.д.А где нам эти книги почитать, вот вопрос. Я бы с удовольствием почитал. В электронном виде нет, хотя бы конспективно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2007, 06:39 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
http://lucacardelli.name/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2007, 12:00 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
я еще собрал там http://agp1.nm.ru/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 00:02 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
s> Автор: sandreynik 12345678> В том то и дело, что наследование кода в отрыве 12345678> от наследования структур данных, с которым ему 12345678> работать, - это полумера. За соответствием одного 12345678> другому надо следить глазками. s> Нормальная практика когда объект имеет метод или s> интерфейс Persistance. Вот он пусть и следит. 12345678> вообще-то за этим должен следить компилятор. s> Компилятор следит за тем что декларировано в синтаксисе языка. s> Значит просто надо написать другой компилятор для другого языка. То, за чем должен следить компилятор, а что проверяется в момент выполнения, зависит от степени типизации языка программирования: статическая или динамическая. Аналогичо, нормальность практики размежевания полей и методов доступа варируется от языка к языку. 12345678> Зачем клиенту запрашивать сами сами объекты с сервера, 12345678> если он может работать с ними через свойства и методы? 12345678> Если же каждому серверному объекту сопоставлен клиентский 12345678> - то их личное дело, какими данными и через что они 12345678> обмениваются. Можно и через самый примитивный SQL, 12345678> если серверные объекты прикручены триггерами к данным. Соверженно верно. Ввиду слабой совместимости моделей данных нереально полагаться на то, что какому-нибудь чудо-вендору удасться зашить ООП в реализацию SQL на сервере. Современые "объектные расширения" на серверных платформах - это убожества по сравнение с тем, что предоставляют полноценные системы программирования для клиента. Практичнее иметь чёткое разделение: SQL - на сервере, "настоящие" объекты - на клиенте. Правда, достаточность примитивного SQL для клиента спорна. Использование "плоских" предложений ввиде строк весьма утомительна для программирования. Пример удачной интеграции - CommonSQL, разработанный фирмой Xanalys (ныне LispWorks) около десяти лет назад, см., например: http://www.lispworks.com/documentation/lw50/LWUG/html/lwuser-268.htm (Имеются и реализации в открытом коде.) Это расширение Коммон Лиспа как библиотечными фукнциями, так и макросами (осмелюсь утверждать, что выразительные возможности и удобство макропрограммирования на Лиспе велики, как ни в каком другом языке). Объекто-ориентированный интерфейс включает: - определения классов, экземпляры которых отображаются в записи РБД (наиболее просто реалзиуется подход "2. Практично. Один КОНКРЕТНЫЙ класс = одна таблица"). - операции выборки и сохранения. Пример: (def-view-class employee (standard-db-object) ((employee-number :db-kind :key :column empno :type integer) (employee-name :db-kind :base :column ename :type (string 20) :accessor employee-name) (employee-department :db-kind :base :column deptno :type integer :accessor employee-department) (employee-job :db-kind :base :column job :type (string 9)) (employee-manager :db-kind :base :column mgr :type integer) (employee-location :db-kind :join :db-info (:join-class department :retrieval :deferred :set nil :home-key employee-department :foreign-key department-number :target-slot department-loc) :accessor employee-location)) (:base-table emp)) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 10:13 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
SQL это всего лишь база данных. Вдумайтесь!! ДАННЫХ. Зачем козе баян. Объект содержит в себе как функционал (код) так и данные. Причем данные он может хранить не только в БД но и в XML файле, в простом файле(Картинки) и т.д. Что бы не привязываться к одному источнику хранения и надо иметь у класса интерфейс Persistance. Который и будет следить как за хранением так и за подкачкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 10:38 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
sandreynikвсего лишь база данных. Вдумайтесь!! ДАННЫХ. Зачем козе баян. чтобы не скучно было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 11:00 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
авторПрактичнее иметь чёткое разделение: SQL - на сервере, "настоящие" объекты - на клиенте.А если клиент веб-страница или что-то еще более примитивное - где тогда будут объекты - на сервере приложений? А если клиентов с объектами несколько разных, кто будет отвечать за соответствие заложенной в них логики? Вот в том-то и дело, что хотелось бы иметь реализацию всей логики, обрабатывающей вводимые данные на сервере, и желательно сервере БД (так и секурнее и централизованнее и быстрее и проще кажется). А на деле получается - кусочек логики в БД, кусочек в серверном приложении, кусочек в клиентских - арррр(((. авторSQL это всего лишь база данных. Вдумайтесь!! ДАННЫХ.А я думал, что SQL это язык запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 13:22 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
>> автор >> Практичнее иметь чёткое разделение: SQL - на сервере, "настоящие" >> объекты - на клиенте. > А если клиент веб-страница или что-то еще более примитивное - где > тогда будут объекты - на сервере приложений? Разумеется, на сервере приложений. Объекты в браузерах довольно зачаточные. > А если клиентов с объектами несколько разных, кто будет > отвечать за соответствие заложенной в них логики? Отчасти - сервер БД (общие ограничения целостности), отчасти - клиент или сервер приложений. > Вот в том-то и дело, что хотелось бы иметь реализацию всей логики, > обрабатывающей вводимые данные на сервере, и желательно сервере БД > (так и секурнее и централизованнее и быстрее и проще кажется). А на > деле получается - кусочек логики в БД, кусочек в серверном > приложении, кусочек в клиентских - арррр(((. Это достойный идеал, но на практике всегда будет иначе. Конечно, в трехзвенке следует сокращать роль оконечных Web-клиентов. ИMХО 1) Возможности программирования на браузерах слишком преувеличены, если не сказать "раздуты", их производителями. Конечно, браузер может поддерживать пародию на объекты, обычно с помощью плагинов, но тогда чем он лучше специализированного клиента? 2) Зачастую HTTP протокол является существенным ограничителем по сравнению с "родными" клиентскими протоколами СУБД. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 14:18 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
12345678А на деле получается - кусочек логики в БД, кусочек в серверном приложении, кусочек в клиентских - арррр(((. Это у кого как. Например есть единое приложение, а где исполняются его кусочки - на сервере или клиенте - дело десятое (и переменное). 12345678А я думал, что SQL это язык запросов. SQL - это декларативный язык программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 14:26 |
|
||
|
SQL и ООП
|
|||
|---|---|---|---|
|
#18+
модЭто у кого как. Например есть единое приложение, а где исполняются его кусочки - на сервере или клиенте - дело десятое (и переменное).Не складывается. Приложений с одной БД в общем случае работает множество и сделанных разными производителями на разных языках. Упаковать все в одно приложение - задача сложная, а иногда бессмысленная. Что обеспечит координацию тех самых функциональных зависимостей между разными приложениями при модернизации системы - вопрос открытый. Либо второй вариант - доступ к базе данных накрывается единым серверным приложением, а все клиенты действуют через него. Соответсвенно, вместо SQL для изменения данных клиенты пользуют уже какое-то самодельное API серверного приложения. А как же реляционная алгебра и все такое? Все равно остается вопрос координации изменений кода приложения с потребным изменением структуры данных и наоборот. Ручками. И почему для реализации такого приложения недостаточно средств самой СУБД, а требуется реализация "на разных уровннях" системы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 15:02 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34903257&tid=1543750]: |
0ms |
get settings: |
13ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 409ms |

| 0 / 0 |
