Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 34   вперед  Ctrl
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
AI


А как на SmallTalk пишут программы, связанные с базами данных?


А точно так же, как и на C++ или Java (см. ODMG 3.0, SmallTalk Binding).
К слову SmallTalk был первым языком, на базе которого и развивались практически все существующие ныне ООСУБД (в т.ч. и Versant Developer Suite), а С++ и Java стали использоваться позднее.
20 янв 05, 13:52    [1260613]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
Значит, все равно, с какими базами работать... Обычный клиент.
20 янв 05, 14:12    [1260708]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
АЗ
Guest
Обычный клиент.
В случае с Gemstone не совсем так.

Server Smalltalk -- GemStone allows database application developers to
create classes and write methods which are stored and executed directly
in the database. These methods can be accessed either internally, or
from external client applications.
20 янв 05, 18:06    [1262026]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
АЗ
Guest
Тот же Ford. Хранилище данных на СУБД Teradata. 2 TB.
Йопт! Ну и? че сказать-то хотел?
Что сколько волка не корми у слона все равно толще?
20 янв 05, 18:09    [1262041]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Alexey Rovdo

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

Никаких проблем, только непонятно, откуда взялся такой точный срок - неделя с со вчерашнего дня. Вроде бы из объяснения не следует.
21 янв 05, 02:17    [1262525]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
АЗ
Обычный клиент.
В случае с Gemstone не совсем так.

Server Smalltalk -- GemStone allows database application developers to
create classes and write methods which are stored and executed directly
in the database. These methods can be accessed either internally, or
from external client applications.


То же самое умеет и java, например, с ораклом. Может классы хранить и исполнять на клиенте, может - на сервере. При этом спокойно может работать и с "необъектными" структурами. А заодно программа во время deployment'а сразу может создавать необходимые структуры в базе данных.
21 янв 05, 10:33    [1263152]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
c127
2 Alexey Rovdo

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

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


Так решила моя левая нога ...
:-)
21 янв 05, 15:42    [1265024]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
AI
То же самое умеет и java, например, с ораклом. Может классы хранить и исполнять на клиенте, может - на сервере. При этом спокойно может работать и с "необъектными" структурами. А заодно программа во время deployment'а сразу может создавать необходимые структуры в базе данных.



Уважаемый Al,
Если найдете это возможным, раскройте данный вопрос поподробнее здесь. Мне бы действительно очень хотелось разобраться с тем, какие объектные функции есть сегодня в популярнейших СУБД, а также понять, насколько они применимы на практике.
21 янв 05, 15:50    [1265074]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
AI
Значит, все равно, с какими базами работать... Обычный клиент.


Я не совсем понял это замечание, особенно первую его часть. Что же касается возможных конфигураций, то для объектных систем возможны как варианты клиент/сервер с хранением и исполнением методов на сервере, так и многозвенные конфигурации с серверами приложений. Как пример могу привести все тот же Versant Developer Suite. В комплекте со специальным расширением Versant SQL он поддерживает хранимые процедуры на Java, которые выполняются на заданной виртуальной машине (фактически играющей роль сервера приложений). При этом для распределения нагрузки можно использовать несколько таких серверов приложений, работающих с единым объектным хранилищем VDS. Похожая схема работы поддерживается и в GemStone (об этом уже упомянули).
Но утверждение "все равно с какими базами работать" меня все-таки смущает - прошу уточнить.
21 янв 05, 16:01    [1265159]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
Alexey Rovdo
Что же касается возможных конфигураций, то для объектных систем возможны как варианты клиент/сервер с хранением и исполнением методов на сервере, так и многозвенные конфигурации с серверами приложений. Как пример могу привести все тот же Versant Developer Suite. В комплекте со специальным расширением Versant SQL он поддерживает хранимые процедуры на Java, которые выполняются на заданной виртуальной машине (фактически играющей роль сервера приложений). При этом для распределения нагрузки можно использовать несколько таких серверов приложений, работающих с единым объектным хранилищем VDS. Похожая схема работы поддерживается и в GemStone (об этом уже упомянули).
Но утверждение "все равно с какими базами работать" меня все-таки смущает - прошу уточнить.


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

В Вашем примере, возможно, клиент (VDS или GemStone - я их не знаю) просто не умеет использовать разные стандарты типа odbc или jdbc. Это может сделать его слишком сильно привязанным к одной базе или платформе, что сильно ограничит область применения или внедрения. Если же стандарты взаимодействия с базами поддерживаются, то никто не может запретить работать им и с ораклом или db2.

P.S. Я не собираюсь рассказывать своими словами то, что есть в стандарте j2ee, например, в плане написания и внедрения приложений. См. java.sun.com.
25 янв 05, 21:14    [1273193]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
PArth
Member

Откуда: теткина деревня
Сообщений: 48
AI

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

....


Это не он путает, это Вы никак не можете снять "шоры" с сознания. Вы настолько привыкли, что данные (база) отдельно, а обработка (клиент) отдельно... На секунду представьте, что это не совсем так. Например, что клиент ничего (почти) ничего не знает о самом существовании БД, а просто разделяет все свои объекты на постоянные (persistent, которые собственно и хранятся в БД, причем, заметьте, вместе с методами) и транзитные (transient, существующие только во время работы клиента). Вот и все...
26 янв 05, 06:30    [1273464]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
PArth

Это не он путает, это Вы никак не можете снять "шоры" с сознания. Вы настолько привыкли, что данные (база) отдельно, а обработка (клиент) отдельно... На секунду представьте, что это не совсем так. Например, что клиент ничего (почти) ничего не знает о самом существовании БД, а просто разделяет все свои объекты на постоянные (persistent, которые собственно и хранятся в БД, причем, заметьте, вместе с методами) и транзитные (transient, существующие только во время работы клиента). Вот и все...

Тогда это будет не СУБД, а Система для Хранения Объектов
26 янв 05, 11:53    [1274175]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
ЗоринАндрей
Member

Откуда: Санкт-Петербург
Сообщений: 3004
Тогда это будет не СУБД, а Система для Хранения Объектов

И что? Хоть горшком назови. Пользователям надо хранить данные, а подходит ли средство хранения под Ваши определения - пофик.
Смоллтокерам повезло что им не надо писать уродливый код работающий с JDBC, а тут персонаж считает odbc-jdbc великим достижением.
И еще посылает на Sun спецификации читать... Че там читать-то? Про EJB не к ночи будь помянут?
Или про JDO который можно сказать списан с того же Версанта?

Smalltalk поддерживает интерфейсы к обычным СУБД
но нафига спрашивается писать
 resultCollection := OrderedCollection new.
    connection := AbtDbmSystem 
        activeDatabaseConnectionWithAlias: 'SAMPLE'.
    querySpec := (AbtQuerySpec new)
        statement: 'SELECT Employee.DIVISION,',
            'Employee.LOCATION,Employee.MANAGER, Employee.NAME FROM Employee',
            'WHERE Employee.Name = "John"'.
    result := activeDatabase resultTableFromQuerySpec: querySpec.
    result do: [:eachRow | resultCollection add: (eachRow asString)].
    ^resultCollection.

когда можно так:
resultCollection := Employee select:
{:anEmployee | anEmployee.name = 'John'}

А то что к этой базе из ваших Дельфей/ВижуалБейсиков не всегда удобно добраться - так это может и к лучшему

Disclaimer: я не смолтокер и не претендую что этот код работает или вообще является смоллтоком. общий смысл от этого не меняется.
26 янв 05, 15:52    [1275433]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
ЗоринАндрей

когда можно так:
resultCollection := Employee select:



Да можно, только это не работа с данными, а выборка записи и на Дельфях/ВижуалБейсиках делается не сложнее.
26 янв 05, 17:50    [1276117]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Andreww
Member [заблокирован]

Откуда:
Сообщений: 1752
2 ЗоринАндрей

"И что? Хоть горшком назови. Пользователям надо хранить данные, а подходит ли средство хранения под Ваши определения - пофик."

Если пользователям надо всего лишь ХРАНИТЬ ДАННЫЕ могу предложить файлы :))
Абсолютно бесплатно, не надо платить 10K$ зха супер объектную надстройку над .NET.

"Смоллтокерам повезло что им не надо писать уродливый код работающий с JDBC, а тут персонаж считает odbc-jdbc великим достижением."

Чем же он уродлив ? JDBC конечно не подарок, но вполне себе читаемый код, а как кстати в SmallTalke с GUI, насколько просто сделать под разные платформы пользовательский интерфейс ? Как там дела с потоками и синхронизацией (и что бы платформеннонезависимо) ? Как дела с библиотекой контейнеров с обработкой исключений и т.п., Раз уж вы взялись клиентов на ST ваять :)

"И еще посылает на Sun спецификации читать... Че там читать-то? Про EJB не к ночи будь помянут?"

ST может похвастать контейнерами лучше чем в EJB2.0 ? Где можно почитать их спецификацию ? Сервера приложений на ST поддерживают statefull - объекты ?

"...но нафига спрашивается писать..."

Если бы все запросы ограничивались Select * from T where F = 'foo' и от СУБД требовалось только их обработать и ничего более, никаких проблем бы не было и был бы один язык, Fortran или может даже ST :))

2 SergSuper

"выборка записи и на Дельфях/ВижуалБейсиках делается не сложнее"

согласен, а на Java или на С++ & STL ещё проще и результат работать будет быстрее.
26 янв 05, 18:08    [1276206]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Andreww

согласен, а на Java или на С++ & STL ещё проще и результат работать будет быстрее.

насчет С++ и простоты я бы попросил обосновать, а вот на Яве одназначно не будет быстрее - все-таки не чистый компилятор, а за счет чего может быть быстрее непонятно.
26 янв 05, 19:17    [1276390]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Andreww
Member [заблокирован]

Откуда:
Сообщений: 1752
>> насчет С++ и простоты я бы попросил обосновать

Попробую (сильно не пинать) :

//////////////////////////////////////////////////////////////////////////////////
bool isFoo(const Foo& value){
............
}

vector<Foo> v;
dest_iterator<Foo> dest;

........................ // Заполнили или прочитали с диска содержимое v

copy_if(v.begin(),v.end(),dest,isFoo);

//////////////////////////////////////////////////////////////////////////////////


isFoo - ф-я отбора

copy_if - копирование по условию отбора

dest - Приёмник

Акромя copy_if есть ещё 10-к копирований : copy, replace_copy, replace_copy_if

Где-то так.

" вот на Яве одназначно не будет быстрее - все-таки не чистый компилятор, а за счет чего может быть быстрее непонятно"

Изначально было - "а выборка записи и на Дельфях/ВижуалБейсиках делается не сложнее"

VB (который не .NET) так работает с массивами, что лучше не надо и вспоминать про скорость, хоть и код родной, а не байт код. С коллекциями чуть быстрее, но с явой сравнимо. Да и ещё есть JIT-компиляция.
26 янв 05, 20:09    [1276474]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
ЗоринАндрей
Тогда это будет не СУБД, а Система для Хранения Объектов

И что? Хоть горшком назови. Пользователям надо хранить данные, а подходит ли средство хранения под Ваши определения - пофик.
Смоллтокерам повезло что им не надо писать уродливый код работающий с JDBC, а тут персонаж считает odbc-jdbc великим достижением.
И еще посылает на Sun спецификации читать... Че там читать-то? Про EJB не к ночи будь помянут?
Или про JDO который можно сказать списан с того же Версанта?

Smalltalk поддерживает интерфейсы к обычным СУБД
но нафига спрашивается писать
 resultCollection := OrderedCollection new.
    connection := AbtDbmSystem 
        activeDatabaseConnectionWithAlias: 'SAMPLE'.
    querySpec := (AbtQuerySpec new)
        statement: 'SELECT Employee.DIVISION,',
            'Employee.LOCATION,Employee.MANAGER, Employee.NAME FROM Employee',
            'WHERE Employee.Name = "John"'.
    result := activeDatabase resultTableFromQuerySpec: querySpec.
    result do: [:eachRow | resultCollection add: (eachRow asString)].
    ^resultCollection.

когда можно так:
resultCollection := Employee select:
{:anEmployee | anEmployee.name = 'John'}

А то что к этой базе из ваших Дельфей/ВижуалБейсиков не всегда удобно добраться - так это может и к лучшему

Disclaimer: я не смолтокер и не претендую что этот код работает или вообще является смоллтоком. общий смысл от этого не меняется.



А Вы, оказывается, читать не умеете. "Типа odbc или jdbc" вовсе не означает обязательно только их. Или Ваш PowerBuilder всегда без них обходится? Это раз. Когда "персонаж" спрашивает, как работает java, я просто обязан его отправить к производителю. Это два. Наконец, в-третьих, не разобравшись в сути вопроса, не надо сразу начинать хамить. Это не вежливо даже для москвича. Впрочем, для жителей Питера в последнее время хамство - норма.
27 янв 05, 13:46    [1278370]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Возникший выше по топику спор между приверженцами SQL и ООП привел к предложению разобрать пример решения конкретной задачи. Задача была предложена здесь.
Решение на базе SQL предложено здесь и за это отдельное спасибо SergSuper, который нашел время для того, чтобы это сделать.
К сожалению апологеты ООП своего решения не предложили. И как я не отнекивался (считаю, что тот, кто ставил задачу заведомо уязвим для критики и решения предлагать не должен), но все-таки прийдется предложить свой вариант.

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

Предлагаемое мною решение создается на базе FastObjects t7. Я буду использовать Java.
Прежде всего отмечу, что не ставлю своей целью предложить наиболее оптимальное решение. Скорее наоборот - структура классов предлагаемая мною для сформулированной задачи даже несколько избыточна. Но раз уж меня вынудили самостоятельно демонстрировать решение моей задачи, то я использую это для демонстрации функциональности и возможностей FastObjects. Поэтому вы увидите некоторое разнообразие методов решения схожих подзадач.

Итак, структура классов для хранения объектных данных:

package avia.model;


public class City {
  public String name;
}

public class Person {
  public String last_name;
  public String first_name;
}

public class Flight {
  public String description;
  public City startpoint;
  public City endpoint;
  public CraftType crafttype;
}

public class CraftType {
  public String description;
  public java.util.HashSet seats1;
  public java.util.HashSet seats2;
}

public class Item {
  public String id;
  public Flight flight;
  public String day;
  public java.util.HashSet tickets1;
  public java.util.HashSet tickets2;
}

public class Seat {
  public int id;
  public int level;
}

public class Ticket {
  public Item item;
  public Seat seat;
  public float money_paid;
  public Person person;
}

Все это дополняется специальным описательным XML-файлом с JDO-метаданными (package.jdo). Вот его содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo SYSTEM "jdo.dtd">
<jdo>
   <extension vendor-name="FastObjects" key="database" value="avia_base"/>
   <extension vendor-name="FastObjects" key="schema" value="avia_dict"/>

<package name="avia.model">

<class name="Item">
   <extension vendor-name="FastObjects" key="index" value="IDIndex">
	<extension vendor-name="FastObjects" key="unique" value="true"/>
	<extension vendor-name="FastObjects" key="member" value="id"/>
   </extension>
</class>

<class name="Person" />
<class name="CraftType" />
<class name="City" />
<class name="Seat" />
<class name="Flight" />
<class name="Ticket" />

</package>

</jdo>

Начнем с создания базы и заполнения ее тестовыми данными.
Для создания базы необходимо воспользоваться входящим в состав FastObjects t7 специальным средством расширения байт-кода Java. Оно запускается после компиляции и, во-первых, модифицирует байт-код для поддержки сохраняемости, а во вторых - позволяет создать т.н. словарь (база, в которой хранятся описания классов хранимых объектов). Затем создается и само хранилище объектов. Весь процесс может выглядеть следующим образом (подробнее в пользовательской документации).

ptj -enhance -create -schema avia_dict
ptadmin -create -schema avia_dict avia_base

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

import com.poet.jdo.*;
import com.poet.jdo.admin.DatabaseAdministration;
import javax.jdo.*;
import java.util.Iterator;
import java.util.Properties;
import java.util.Collection;
import avia.model.*;

public class Avia {

    public static void main( String[] args ) {

      Properties pmfProps = new Properties();

      pmfProps.put("javax.jdo.PersistenceManagerFactoryClass",
                   "com.poet.jdo.PersistenceManagerFactories");
      pmfProps.put("javax.jdo.option.ConnectionURL",
                   "fastobjects://LOCAL/W:/Borland Studio Projects/Avia_proj/avia_base");
      PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(
          pmfProps);

      PersistenceManager pm = pmf.getPersistenceManager();

      Transaction txn = null;

      txn = pm.currentTransaction();
      txn.begin(); // starts the transaction

      City city_A = new City();
      city_A.name = "A";
      pm.makePersistent(city_A); // makes the object persistent

      City city_B = new City();
      city_B.name = "B";
      pm.makePersistent(city_B); // makes the object persistent

      City city_C = new City();
      city_C.name = "C";
      pm.makePersistent(city_C); // makes the object persistent

      CraftType craft1 = new CraftType();
      craft1.description = "Boeing 747";
      craft1.seats1 = new java.util.HashSet();
      craft1.seats2 = new java.util.HashSet();
      pm.makePersistent(craft1);

      CraftType craft2 = new CraftType();
      craft2.description = "TU 154";
      craft2.seats1 = new java.util.HashSet();
      craft2.seats2 = new java.util.HashSet();
      pm.makePersistent(craft2);

      Flight flight1 = new Flight();
      flight1.description = "A-B";
      flight1.startpoint = city_A;
      flight1.endpoint = city_B;
      flight1.crafttype = craft1;
      pm.makePersistent(flight1);

      Flight flight2 = new Flight();
      flight2.description = "B-C";
      flight2.startpoint = city_B;
      flight2.endpoint = city_C;
      flight2.crafttype = craft1;
      pm.makePersistent(flight2);

      Flight flight3 = new Flight();
      flight3.description = "C-A";
      flight3.startpoint = city_C;
      flight3.endpoint = city_A;
      flight3.crafttype = craft1;
      pm.makePersistent(flight3);

      Flight flight4 = new Flight();
      flight4.description = "C-B";
      flight4.startpoint = city_C;
      flight4.endpoint = city_B;
      flight4.crafttype = craft2;
      pm.makePersistent(flight4);

      Flight flight5 = new Flight();
      flight5.description = "B-A";
      flight5.startpoint = city_B;
      flight5.endpoint = city_A;
      flight5.crafttype = craft2;
      pm.makePersistent(flight5);

      Flight flight6 = new Flight();
      flight6.description = "A-C";
      flight6.startpoint = city_A;
      flight6.endpoint = city_C;
      flight6.crafttype = craft2;
      pm.makePersistent(flight6);

      Seat s1 = new Seat();
      s1.id = 1;
      s1.level = 1;
      pm.makePersistent(s1);
      craft1.seats1.add( s1);

      Seat s2 = new Seat();
      s2.id = 2;
      s2.level = 1;
      pm.makePersistent(s2);
      craft1.seats1.add( s2);

      Seat s3 = new Seat();
      s3.id = 3;
      s3.level = 1;
      pm.makePersistent(s3);
      craft1.seats1.add( s3);

      Seat s4 = new Seat();
      s4.id = 4;
      s4.level = 2;
      pm.makePersistent(s4);
      craft1.seats2.add( s4);

      Seat s5 = new Seat();
      s5.id = 5;
      s5.level = 2;
      pm.makePersistent(s5);
      craft1.seats2.add( s5);

      Seat s6 = new Seat();
      s6.id = 1;
      s6.level = 2;
      pm.makePersistent(s6);
      craft2.seats2.add( s6);

      Seat s7 = new Seat();
      s7.id = 2;
      s7.level = 2;
      pm.makePersistent(s7);
      craft2.seats2.add( s7);

      Seat s8 = new Seat();
      s8.id = 3;
      s8.level = 2;
      pm.makePersistent(s8);
      craft2.seats2.add( s8);

      Seat s9 = new Seat();
      s9.id = 4;
      s9.level = 1;
      pm.makePersistent(s9);
      craft2.seats1.add( s9);

      Seat s10 = new Seat();
      s10.id = 5;
      s10.level = 1;
      pm.makePersistent(s10);
      craft2.seats1.add( s10);

      Item item1 = new Item();
      item1.id = "1";
      item1.day = "01.01.2005";
      item1.flight = flight1;
      item1.tickets1 = new java.util.HashSet();
      item1.tickets2 = new java.util.HashSet();
      pm.makePersistent(item1);

      Item item2 = new Item();
      item2.id = "2";
      item2.day = "01.01.2005";
      item2.flight = flight2;
      item2.tickets1 = new java.util.HashSet();
      item2.tickets2 = new java.util.HashSet();
      pm.makePersistent(item2);

      Item item3 = new Item();
      item3.id = "3";
      item3.day = "01.01.2005";
      item3.flight = flight3;
      item3.tickets1 = new java.util.HashSet();
      item3.tickets2 = new java.util.HashSet();
      pm.makePersistent(item3);

      Item item4 = new Item();
      item4.id = "4";
      item4.day = "02.01.2005";
      item4.flight = flight4;
      item4.tickets1 = new java.util.HashSet();
      item4.tickets2 = new java.util.HashSet();
      pm.makePersistent(item4);

      Item item5 = new Item();
      item5.id = "5";
      item5.day = "02.01.2005";
      item5.flight = flight5;
      item5.tickets1 = new java.util.HashSet();
      item5.tickets2 = new java.util.HashSet();
      pm.makePersistent(item5);

      Item item6 = new Item();
      item6.id = "6";
      item6.day = "02.01.2005";
      item6.flight = flight6;
      item6.tickets1 = new java.util.HashSet();
      item6.tickets2 = new java.util.HashSet();
      pm.makePersistent(item6);

      Item item7 = new Item();
      item7.id = "7";
      item7.day = "01.01.2005";
      item7.flight = flight1;
      item7.tickets1 = new java.util.HashSet();
      item7.tickets2 = new java.util.HashSet();
      pm.makePersistent(item7);

      Item item8 = new Item();
      item8.id = "8";
      item8.day = "01.01.2005";
      item8.flight = flight2;
      item8.tickets1 = new java.util.HashSet();
      item8.tickets2 = new java.util.HashSet();
      pm.makePersistent(item8);

      Item item9 = new Item();
      item9.id = "9";
      item9.day = "01.01.2005";
      item9.flight = flight3;
      item9.tickets1 = new java.util.HashSet();
      item9.tickets2 = new java.util.HashSet();
      pm.makePersistent(item9);

      txn.commit(); 

     ...
}

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

      // Выдаем билет
      // Дано: рейс id, номер места m, имя пассажира FirstName, LastName
      // для простоты уникальность имени пассажира считается предопределенной

      txn = pm.currentTransaction();
      txn.begin();

      itemExtent = pm.getExtent( avia.model.Item.class, true );
      iter = com.poet.jdo.Extents.iterator(itemExtent, "IDIndex");
      boolean found = com.poet.jdo.Extents.findKey(iter, "1");
      if (found)
        {
          Item my_item = (Item) com.poet.jdo.Extents.current(iter);
          Person psn = new Person();
          psn.first_name = "Ivanov";
          psn.last_name = "Ivan";
          pm.makePersistent(psn);

          Ticket new_tk = new Ticket();
          new_tk.seat = (Seat) my_item.flight.crafttype.seats1.toArray()[0];
          new_tk.person = psn;
          new_tk.item = my_item;
          new_tk.money_paid = 100;
          pm.makePersistent(new_tk);
          my_item.tickets1.add(new_tk);

        }

        txn.commit();

        // Бронируем билет
        // Дано: рейс id, номер места m, имя пассажира FirstName, LastName
        // для простоты уникальность имени пассажира считается предопределенной

        txn = pm.currentTransaction();
        txn.begin();

        itemExtent = pm.getExtent( avia.model.Item.class, true );
        iter = com.poet.jdo.Extents.iterator(itemExtent, "IDIndex");
        found = com.poet.jdo.Extents.findKey(iter, "1");
        if (found)
          {
            Item my_item = (Item) com.poet.jdo.Extents.current(iter);
            Person psn = new Person();
            psn.first_name = "Petropv";
            psn.last_name = "Petr";
            pm.makePersistent(psn);

            Ticket new_tk = new Ticket();
            new_tk.seat = (Seat) my_item.flight.crafttype.seats1.toArray()[1];
            new_tk.person = psn;
            new_tk.item = my_item;
            new_tk.money_paid = 0;
            pm.makePersistent(new_tk);
            my_item.tickets1.add(new_tk);

          }

          txn.commit();


Теперь попробуем выполнить запросы к базе данных. Информацию будем выводить в виде таблички.

        // Запрос 1
        // Дано: дата d, маршрут [Z1, Z2]
        // Выдать таблицу (билеты в наличии): рейс - класс - кол-во мест

        // Пусть d = 01.01.2005, маршрут = A-B

        txn = pm.currentTransaction();
        txn.begin();

        itemExtent = pm.getExtent( avia.model.Item.class, true );
        String predicate = 
"WHERE this.day = \"01.01.2005\" and this.flight.startpoint.name = \"A\" and  
this.flight.endpoint.name = \"B\" ";
        iter = itemExtent.iterator();
        com.poet.jdo.Extents.setFilter( iter, predicate );

        System.out.println("id  Date       Description  Class    Free seats");

        while (iter.hasNext() )
        {
          Item itm = (Item) iter.next();
          System.out.println( itm.id + "   " + itm.day + " " +
 itm.flight.description + "          1-st     " +
 Integer.toString(itm.flight.crafttype.seats1.size() - itm.tickets1.size()) );
          System.out.println( itm.id + "   " + itm.day + " " +
 itm.flight.description + "          2-nd     " +
 Integer.toString(itm.flight.crafttype.seats2.size() - itm.tickets2.size()) );
        }

        txn.commit();

        // Запрос 2
        // Дано: рейс id
        // Выдать таблицу (свободные места): номер места m - класс - цена

        // Пусть id = 1

        txn = pm.currentTransaction();
        txn.begin();

        itemExtent = pm.getExtent( avia.model.Item.class, true );
        iter = com.poet.jdo.Extents.iterator(itemExtent,"IDIndex");

        found = com.poet.jdo.Extents.findKey(iter, "1");
        if (found)
        {
          Item my_item = (Item) com.poet.jdo.Extents.current(iter);
          Collection all_seats = new java.util.HashSet(my_item.flight.crafttype.seats1);
          all_seats.addAll(my_item.flight.crafttype.seats2);

          String queryString = 
"DEFINE EXTENT Tickets FOR avia.model.Ticket; 
SELECT ticket.seat FROM Tickets AS ticket WHERE ticket.item.id = \"1\" ";
          Query oqlQuery = pm.newQuery( "org.odmg.OQL", queryString );
          Collection occupied_seats = (Collection)oqlQuery.execute();

          all_seats.removeAll(occupied_seats);

          iter = all_seats.iterator();

          System.out.println("");
          System.out.println("01.01.2005 A-B");
          System.out.println("Seat   Class   Cost");
          while (iter.hasNext() )
          {
            Seat st = (Seat) iter.next();
            System.out.println( Integer.toString(st.id) + "      " +
 Integer.toString(st.level) + "       NNN.00$" );
          }

        }


        txn.commit();


        // Запрос 3
        // Дано: рейс id
        // Выдать таблицу (список пассажиров):
        //    место - Name - выкуплено/забронировано

        // Пусть id = 1

        txn = pm.currentTransaction();
        txn.begin();

        Extent ticketExtent = pm.getExtent( avia.model.Ticket.class, true );
        iter = ticketExtent.iterator();
        com.poet.jdo.Extents.setFilter( iter, "WHERE this.item.id = \"1\" " );

        System.out.println("");
        System.out.println("01.01.2005 A-B");
        System.out.println("Seat   Passenger       State");

        while (iter.hasNext() )
        {
          Ticket tk = (Ticket) iter.next();
          System.out.println( Integer.toString(tk.seat.id) + "      " +
  tk.person.first_name + " " + tk.person.last_name + "    " +
                              (tk.money_paid > 0 ? " paid" : "reserved"));
        }

        txn.commit();


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

С уважением, Алексей Ровдо.

К сообщению приложен файл (Avia_proj.rar - 43Kb) cкачать
27 янв 05, 19:36    [1280166]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Равноценны ?

Этот листинг как минимум раза в четыре длиннее :(
27 янв 05, 20:06    [1280215]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
Gluk (Kazan)
Равноценны ?

Этот листинг как минимум раза в четыре длиннее :(


Да, но этот листинг представляет собой готовое Java-приложение, а не абстрактный набор запросов и кроме этого значительная его часть посвящена заполнению базы тестовыми данными. Так что если есть желание сравнивать длину, то следует рассматривать только отдельные участки этого листинга. Да и вообще сама длина программы не говорит ни о чем. Ко всему она еще и сильно зависит от выбранного языка программирования.
28 янв 05, 10:45    [1281050]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Alexey Rovdo

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

Это сильное утверждение. Ваше решение значительно, в разы, длиннее. Мы даже не обращаем внимание на "// для простоты уникальность имени пассажира считается предопределенной". Правда в реляционном решении нет заполнения БД, но даже без этой части реляционное решение, как тут сказали, раза в 4 короче.

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

Это не сильно усложнит реляционное решение. Тем более если брать не MSSQL, а ASA или оракл, или ДБ2, у которых есть рекурсивные запросы. Если захотите можем попробовать позже.

> В своем решении я также буду придерживаться такого приближения. Во-вторых, нивелировано различие между местами, т.е. пассажир покупает билет, а его место не конкретизируется. Позволю себе сохранить данное требование, поскольку отказ от него чрезмерно упрощает задачу.

Это возможно верно в случае ОО, но в случае реляционного решения введение такго условия вообще не усложняет решение, даже немного упрощает. Если я правильно разобрался в идее SergSuper-а, то в таблицах Place, Sold достаточно поле class заменить (по смыслу) на seat а cnt можно убрать. Свободные места:

select * from Place p join Shedul sh on p.fly=sh.fly
where not exists
(select 1 from Sold s where s.race=sh.race and s.seat=p.seat and s.date=sh.date) and [additional conditins such as date=@date and race=@race etc.])

Вроде нигде не ошибся.

Не могли бы Вы теперь показать как в FastObjects и предложенной схеме получить:
1) типы самолетов, которыми летал Scott Tiger, 1,9,12,13,18,22,28 января 2003 года
2) номера рейсов которые были в январе 2003 года и на которые оставалось от 10 до 20 непроданных билетов включительно, но самолет не "TU 154"
3) пары рейсов, где 10 или более пассажиров общие (летели одни и те же люди)
28 янв 05, 11:01    [1281128]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
c127
Guest
2 Alexey Rovdo

>Да, но этот листинг представляет собой готовое Java-приложение, а не абстрактный набор запросов и кроме этого значительная его часть посвящена заполнению базы тестовыми данными.

Заполнение уже вычтено. С заполнением разница раз в 8.

У SergSuper-а только структура данных задана схематично, но там достаточно заменить
Race рейсы
race ключ
caption описание

на
create table race (
race int not null primary key,
caption varchar(65535));

и т.д. и решение становится готовым SQL решением. А по длине то же самое.

>Да и вообще сама длина программы не говорит ни о чем.

Это только в теории так, пока не начали программировать.

>Ко всему она еще и сильно зависит от выбранного языка программирования.

Верно, но язык Вы выбирали сами. Выберете другой.
28 янв 05, 11:15    [1281197]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Su  [new]
Alexey Rovdo
Member

Откуда: Москва
Сообщений: 913
c127
2 Alexey Rovdo

>Да, но этот листинг представляет собой готовое Java-приложение, а не абстрактный набор запросов и кроме этого значительная его часть посвящена заполнению базы тестовыми данными.

Заполнение уже вычтено. С заполнением разница раз в 8.



Чушь. Демонстрирую для запроса 1:

SQL:

select race, p.class, p.cnt-sum(isnull(cnt,0))
  from Shedul s 
  inner join Place p where s.fly=p.fly
  left join Sold d on d.race=s.race and d.date='нужная дата' and d.class=p.class  and d.flag=1
  where s.date='нужная дата' and s.race='нужный рейс'
  group by race, p.class, p.cnt

Java (FastObjects):

       com.poet.jdo.Extents.setFilter( iter, "WHERE this.day = \"01.01.2005\" and this.flight.startpoint.name = \"A\" and  
this.flight.endpoint.name = \"B\" " );

        System.out.println("id  Date       Description  Class    Free seats");

        while (iter.hasNext() )
        {
          Item itm = (Item) iter.next();
          System.out.println( itm.id + "   " + itm.day + " " +
 itm.flight.description + "          1-st     " +
 Integer.toString(itm.flight.crafttype.seats1.size() - itm.tickets1.size()) );
          System.out.println( itm.id + "   " + itm.day + " " +
 itm.flight.description + "          2-nd     " +
 Integer.toString(itm.flight.crafttype.seats2.size() - itm.tickets2.size()) );
        }

Во-первых никакой 8-кратной разницы не вижу. А во-вторых справедливости ради нам нужно было бы рассматривать не чистый SQL-код, а код на Java, который посылает соответствующий SQL-запрос и получает результат.

Да, я выбрал Java, потому что мне так удобнее. Да, для ООСУБД FastObjects я не могу представить голый OQL-запрос. Но в самом голом OQL или SQL тексте нет практического смысла - на практике всегда приходится писать приложение, которое отвечает за ввод параметров запроса и как-то обрабатывает полученные результаты. Вот в SQL-запросе 'нужный рейс' откуда берется? В Java программе я элементарно могу попросить пользователя ввести этот исходный параметр и поместить введенное значение в переменную. Java-программу я могу запустить для регулярного вывода информации на электронное табло и т.п. А SQL-запрос представляет собой лишь фрагмент, который иллюстрирует центральный алгоритм решения задачи, но не является полным решением.

Именно чтобы проиллюстрировать этот факт я и ввел в задачу такие вопросы как "выдать билет", "забронировать билет", которые как нельзя лучше иллюстрируют описанную проблему.
28 янв 05, 11:50    [1281425]     Ответить | Цитировать Сообщить модератору
 Re: Объектные СУБД от Versant Corporation (FastObjects .NET, FastObjects t7, Developer Suite)  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Alexey Rovdo
Gluk (Kazan)
Равноценны ?

Этот листинг как минимум раза в четыре длиннее :(


Да, но этот листинг представляет собой готовое Java-приложение, а не абстрактный набор запросов и кроме этого значительная его часть посвящена заполнению базы тестовыми данными. Так что если есть желание сравнивать длину, то следует рассматривать только отдельные участки этого листинга. Да и вообще сама длина программы не говорит ни о чем. Ко всему она еще и сильно зависит от выбранного языка программирования.


Вы таки будете смеяться, но около 50% текста моих приложений на Delphi занимает весьма компактный SQL код. Я знаете-ли ценю свое время :) Кроме того, чем больше текста, тем больше потенциальных ошибок.
28 янв 05, 11:57    [1281465]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 34   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить