Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие... / 25 сообщений из 82, страница 1 из 4
23.01.2004, 17:19
    #32386551
Michael BAG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Вот пытаюсь разобраться со всевозможными РСУБД и понять, что лучше использовать да работы с ОЧЕНЬ сложной структурой объектной классификации...
Интересует следующий вопрос.
Чем лухше (хуже) Microsoft SQL 2000 чем другие субдешки?
(Postgre, SyBase, InterBase, MaxDB by MySQL, InferMix и еще че-нть)

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

Все, что я пока понимаю, так это то, что MS SQL весьма похошь (сродни) с Sybase'ом, и InterBase их в некоторых принципиальных вопросах зранения самих баз "обходит".

На самом деле можно воспринимать вопрос как анализ всех РСУБД.

Помогите. На самом деле очень нужна ваша помощь.
...
Рейтинг: 0 / 0
23.01.2004, 17:22
    #32386555
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Все, что я пока понимаю, так это то, что MS SQL весьма похошь (сродни) с Sybase'ом, и InterBase их в некоторых принципиальных вопросах зранения самих баз "обходит".

Страшно интересно - это в каких еще и "принципиальных вопросах" Interbase их обходит? :)
...
Рейтинг: 0 / 0
23.01.2004, 17:58
    #32386610
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Я даже и не знаю, чего тут сказать, когда нужно сравнивать с InterBase, MaxDB by MySQL, InferMix и еще че-нть - я из них даже гнекоторые и не слышал.

ЗЫ Как сравнить трактор и сенокосилку??????

-- Tygra's --
...
Рейтинг: 0 / 0
23.01.2004, 18:40
    #32386664
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
--что лучше использовать да работы с ОЧЕНЬ сложной структурой объектной классификации...

насколько сложной ?

теоритически да и прктически любую сложную структуру можно свернуть в одну таблицу
...
Рейтинг: 0 / 0
26.01.2004, 11:49
    #32387509
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
попробуйте на MS SQL реализовать подобное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
 --------------------------------------------------------
 
 --  ItemID		Код узла дерева
 
 --  ParentID	Родительский элемент
 
 --  Name		Наименование узла
 
 --------------------------------------------------------
 
CREATE TABLE dict.Dict (
    ItemID	INTEGER	NOT NULL,
    ParentID	INTEGER,
    Name	CHAR( 35 ),
    constraint  AtParent CHECK (ParentID<>ItemID),
    constraint  AtItemID PRIMARY KEY (ItemID)
)
@

CREATE UNIQUE INDEX dict.IDict ON dict.Dict (Name) ALLOW REVERSE SCANS
@
CREATE UNIQUE INDEX dict.IDictParent ON dict.Dict (ParentID,ItemID)
@

 ----------------------------------------------
 
 -- Запрещаем ссылку на несуществующие записи
 
 -- при обновлении ParentID
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BUDictParent
NO CASCADE BEFORE UPDATE ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (
	(N.ParentID IS NOT NULL)
    AND ((SELECT P.ItemID FROM dict.Dict P WHERE P.ItemID=N.ParentID) IS NULL)
)	SIGNAL SQLSTATE '75011' ('Несуществующий ParentID')
@

 ----------------------------------------------
 
 -- Защита от рекурсивного зацикливания
 
 -- при обновлении ParentID
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BUDict
NO CASCADE BEFORE UPDATE ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WITH Lvl (TopItemID,ItemID,ParentID)
AS (
	SELECT bottom.ItemID,bottom.ItemID,bottom.ParentID
		FROM dict.Dict AS bottom
	        WHERE bottom.ItemID=N.ParentID
	UNION ALL
	SELECT Lvl.TopItemID,parent.ItemID,parent.ParentID
    	FROM Lvl, dict.Dict AS parent
	        WHERE parent.ItemID=Lvl.ParentID
            	AND Lvl.ParentID<>Lvl.TopItemID
)
SELECT
    CASE 
    	WHEN Lvl.ParentID=N.ItemID THEN RAISE_ERROR('70021','Рекурсивное зацикливание')
        ELSE Lvl.ParentID
    END
FROM Lvl 
@

 ----------------------------------------------
 
 -- Запрещаем ссылку на несуществующие записи
 
 -- при добавлении новой записи
 
 -- Побочный эффект - не позволяет строить
 
 -- дерево в одной транзакции
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BIDictParentID
NO CASCADE BEFORE INSERT ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (
	(N.ParentID IS NOT NULL)
    AND ((SELECT P.ItemID FROM dict.Dict P WHERE P.ItemID=N.ParentID) IS NULL)
) SIGNAL SQLSTATE '75011' ('Несуществующий ParentID')
@


 ----------------------------------------------
 
 -- Запрещаем удаление родительского узла
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BDDict
NO CASCADE BEFORE DELETE ON dict.Dict
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN (
(SELECT COUNT(*) FROM dict.Dict D
	WHERE D.ParentID=O.ItemID)> 0 
) SIGNAL SQLSTATE '75031' ('Существуют ссылки на узел')
@



insert into dict.Dict (ItemID,ParentID,Name) values ( 1 ,NULL,'root')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 2 , 1 ,'Два')				@
insert into dict.Dict (ItemID,ParentID,Name) values ( 3 , 1 ,'Три')				@
insert into dict.Dict (ItemID,ParentID,Name) values ( 4 , 1 ,'Четыре')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 5 , 2 ,'Пять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 6 , 2 ,'Шесть')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 7 , 3 ,'Семь')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 8 , 3 ,'Восемь')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 9 , 3 ,'Девять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 10 , 6 ,'Десять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 11 , 6 ,'Одиннадцать')	@
insert into dict.Dict (ItemID,ParentID,Name) values ( 12 , 9 ,'Двенадцать')		@
insert into dict.Dict (ItemID,ParentID,Name) values ( 13 , 12 ,'Тринадцать')	@
insert into dict.Dict (ItemID,ParentID,Name) values ( 14 , 13 ,'Четырнадцать')	@
@

 -----------------------------------------------------
 
 --
 
 --  1--+--2---------+--5
 
 --     |            |
 
 --     +--3--+--7   +--6--+--10
 
 --     |     |            |
 
 --     +--4  +--8         +--11
 
 --           |
 
 --           +--9--12--13--14
 
 --
 
 --
 
 ----------------------------------------------------
 

select * from dict.Dict@






Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 --Выбор всех предков для опции
 
with Node (ItemId,ParentId,Name,Cnt)
as (
	select child.ItemId,child.ParentId,child.Name, 0 
	    from dict.Dict child
		    where child.ItemId= 13 

	union all
   		select parent.ItemId,parent.ParentId,parent.Name,node.Cnt+ 1 
        	from dict.Dict parent, node 
            where parent.ItemId=node.ParentID )

select * from Node order by Cnt desc
@

 --Определение уровня вложеннности для узла
 
with Lvl (Level,ParentID) 
as (
	select  0 ,ParentID
    	from dict.Dict bottom
        	where ItemID= 1 

    union all

	select Lvl.Level+ 1 ,parent.ParentID from dict.Dict parent,Lvl
    	where parent.ItemID=Lvl.ParentID )
select count(*) from Lvl
@

...
Рейтинг: 0 / 0
26.01.2004, 12:37
    #32387604
f_w_p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Страшно интересно - это в каких еще и "принципиальных вопросах" Interbase их обходит? :)
Ну навскидку:
FireBird
- Версионник
- Имеет такой тип данных как ARRAY
- Имеет такую фичу как EVENT
- Многоплатформенный
- Бесплатный
Зато
MSSQL
- Блокировочник
- Имеет отличный оптимизатор запросов
- лучше держит большое количество коннектов
- Имеет более продвинутый T-SQL

и т.д.
По-моему это уже было:-))).
...
Рейтинг: 0 / 0
26.01.2004, 17:49
    #32388207
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
gardenman
попробуйте на MS SQL реализовать подобное:

Триггера - реализуемы. Некоторые как after, некоторые как instead (честно говоря толком не смотрел, какие как кто). Один - просто FK, как я понял.
Рекурсивные выборки - как table UDF. Согласен, не так изящно, но реализуемо :-)
Кста, некоторые триггера можно и несколько эффективнее написать (при проверке на невозможность удаления родительского узла нет необходимости считать к-во дочерних узлов, надо просто узнать, есть ли хоть один, но, возможно, это просто осбенность реализации приведенного триггера).
И, насколько я понял, в MS SQL можно построить дерево в одной транзакции.
...
Рейтинг: 0 / 0
26.01.2004, 18:08
    #32388240
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
>Кста, некоторые триггера можно и несколько эффективнее написать (при проверке на невозможность удаления родительского узла нет необходимости считать к-во дочерних узлов, надо просто узнать, есть ли хоть один, но, возможно, это просто осбенность реализации приведенного триггера).

- вот с этим согласиться можно...
А вот как быть с триггерами for each row?

триггеры - insted of - эт вааще - отстой. Они на вьюшках, и работают медленнее.

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

А как насчет промежуточных группировок GROUPINGSET? а операторы CUBE ROLLUP?

Но факт есть факт - реализация языка запросов для MS SQL отстает от DB2 и ORACLE очень сильно. Да и вообще в базах данных ток IBM и Oracle разбираются...
...
Рейтинг: 0 / 0
26.01.2004, 18:34
    #32388271
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
for each row - ручками, открываем курсор по inserted/deleted и вперёд :-)
instead of - он и для табличек тоже, насколько я знаю. Насчет скорости - не имею понятия, триггера использовал только пару раз (у меня к ним стойкое предубеждение сложилось в 6.5, а затем пообвыкся без них. Сейчас, говорят, всё значительно лучше).
По поводу GROUPINGSET и CUBE ROLLUP - это о чем мы?

А ежели брать конкретную задачу, как то:
1. Запретить зацикливание
2. Запретить ссылаться на несуществующую запись
3. Запретить удалять предка, у которого есть доченрние записи.
4. Получить полный путь узла.
5. Получить вложенность
То это реализуется 1 FK(защита от ссылок на несуществующие записи), 1-м триггером(защита от зацикливания), и 2-мя функциями (получение списка предков и получение вложенности).
Для пущего понту можно организовать уровень вложенности как computed column в таблице :-) Правда, не рекомендую всё-же...
...
Рейтинг: 0 / 0
26.01.2004, 20:38
    #32388380
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
gardenman -- Запрещаем ссылку на несуществующие записи
-- при добавлении новой записи
-- Побочный эффект - не позволяет строить
-- дерево в одной транзакции
А вот были бы триггеры - insted of - можно было бы и в одной транзакции сделать, но вот нельзя в Оракле реализовать подобное :)
...
Рейтинг: 0 / 0
26.01.2004, 21:00
    #32388395
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
... и делается это без всякой отмены действий триггеров - на то они и insted , что работают вместо действия.

А что касается триггеров for each row - и хорошо что их нет. Надо с данными работать, а не с записями.

Трудно удержаться:
Но факт есть факт - реализация языка запросов для ORACLE отстает от MS SQL очень сильно. Да и вообще в базах данных ток MS разбирается...
...
Рейтинг: 0 / 0
27.01.2004, 00:14
    #32388459
Yo!
Yo!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
не хочу расстраивать но тригеры insted of в оракле очень давно ...
...
Рейтинг: 0 / 0
27.01.2004, 03:33
    #32388478
s79
s79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
SergSuper\r
Трудно удержаться: \r
Но факт есть факт - реализация языка запросов для ORACLE отстает от MS SQL очень сильно. Да и вообще в базах данных ток MS разбирается...\r
\r
Давно я так не смеялся. Класная шутка. \r
А если это не шутка. то /topic/60927 и последние страницы читать вдумчиво.
...
Рейтинг: 0 / 0
27.01.2004, 09:48
    #32388601
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
gardenman А вот как быть с триггерами for each row? Курсор, только у меня почему-то 95% триггеров работает без курсоров :( Как быть? :))

gardenman триггеры - insted of - эт вааще - отстой. Они на вьюшках, и работают медленнее.Работают они и на таблицах, а почему отстой, почему медленнее?

gardenman А как насчет промежуточных группировок GROUPINGSET?Просвети, что это такое - возможно есть решение.

gardenman а операторы CUBE ROLLUP? ROLLUP есть и MS SQL

gardenman Но факт есть факт - реализация языка запросов для MS SQL отстает от DB2 и ORACLE очень сильно. Да и вообще в базах данных ток IBM и Oracle разбираютсяВ приведенной чуть выше ссылке уже был один, который даже тему не прочитал :))
...
Рейтинг: 0 / 0
27.01.2004, 11:12
    #32388732
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
2 locky > 5. Получить вложенность
То это реализуется 1 FK(защита от ссылок на несуществующие записи), 1-м триггером(защита от зацикливания), и 2-мя функциями (получение списка предков и получение вложенности).
Для пущего понту можно организовать уровень вложенности как computed column в таблице :-) Правда, не рекомендую всё-же...


Внешний ключ?... хорошо подумал? Ну ты совсем не Штирлиц)))
Штирлиц подумал , ему понравилось, и он подумал еще раз...))
учись у Штирлица)

FK в таблице на саму себя?..) Я праильно понял? Интересно, а корневые элементы как буим делать?

Зацикливание в дереве может возникнуть по нескольким причинам:
1) изменение ParentID - тут все понятно.
2) Вставка в дерево сразу нескольких записей в одной транзакции
в которых уже имеется зацикливание.
при вставке нескольких элементов есть вероятность того, что какая-то запись не вставицца, если данные были подготовлены криво,(как правило у всех программеров руки слегка кривоваты) поэтому лучше все делать последовательно закомитив.

ИМХО модель БД (таблицы, индексы, триггеры)
должна сама себя защищать от кривизны рук программистов, к чему я и стремлюсь всегда всеми силами.
...
Рейтинг: 0 / 0
27.01.2004, 11:15
    #32388737
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
GROUPING - оператор, позволяющий в SELECT выводить строки с промежуточными итогами по группам. В результате отчет формируется запросто одним единственным запросом.
...
Рейтинг: 0 / 0
27.01.2004, 11:17
    #32388743
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
И еще одно - Db2 - единственная база, которая поддерживает C++ в полной мере.
...
Рейтинг: 0 / 0
27.01.2004, 11:29
    #32388766
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Нет проблем - пиши на С++.
Какого хрена тогда тут тебе по MS SQL надо спрашивать? Если ты такой умный?

ЗЫ Я не против сравнения, но именно ТАК..... Это в цирке надо товарищу выступать.

-- Tygra's --
...
Рейтинг: 0 / 0
27.01.2004, 11:35
    #32388778
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
прости, Тигра, больше не буду ругать MS SQL...
Просто скучно мне было...)))
...
Рейтинг: 0 / 0
27.01.2004, 11:37
    #32388785
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
По моему GROUPING есть в любом СУБД, во всяком случае известном мне (MSSQL, Sybase ASE, Sybase ASA). С деревьями тоже проблем не вижу - если ParentID NULLABLE, то FOREIGN KEY спокойно прокатывает. Насчет поддержки C++ не понял - по моему в любой СУБД можно спокойно писать расширенные хранимые процедуры на C или Java (вместо нее MSSQL скоро будет держать C#). С другой стороны не помню еще случая, когда мне бы понадобилось вместо обычной ХП накатать ее на C или Java. Разве что подумываю парсер SQL пристроить для собственных нужд, но это к СУБД на самом деле никакого отношения не имеет.
...
Рейтинг: 0 / 0
27.01.2004, 11:42
    #32388796
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
2gardenman
ну да, FK сам на себя.... А что? А корневые элементы, к примеру, с NULL в ParentId.
DB2 такое не умеет? Не знал :-( Я, правда, о ней почти ничего не знаю, кроме самого факта существования и чьей-то реплики " когда-то у DB2 был самый лучший оптимизатор".
По поводу проверки зацикливания. При срабатывании триггера after в базе вроде как уже записано дерево. Что мешает проверить его на зацикленность и при необходимости откатить транзкцию? И какая при этом разница, одну я запись вставил, или 20?
groupingset и cube rollup - попробуйте почитать BOL select... group by ... with rollup/cube - может быть это то, что Вы имеете в виду?
"Единственная... котороая поддерживает C++ в полной мере"
Мне казалось, что сервера БД должны поддерживать стандарты SQL.... :-) Ну хоть как-нибудь :-)
...
Рейтинг: 0 / 0
27.01.2004, 12:24
    #32388870
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
lockygroupingset и cube rollup - попробуйте почитать BOL select... group by ... with rollup/cube - может быть это то, что Вы имеете в виду? Если это мне :), то я знаю, что есть GROUPING и CUBE/ROLLUP. Если GROUPINGSET тоже самое, то все понятно, если нет - хотелось бы услышать и объяснения :)
...
Рейтинг: 0 / 0
27.01.2004, 12:36
    #32388891
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
2AAron
Не, не Вам :-)
Кста, вспомнилось - в select есть еще compute by..

В продолжение флейма: я могу написать запрос, который ни в жисть не напишешь на DB2 :-)
...
Рейтинг: 0 / 0
27.01.2004, 12:49
    #32388921
Nikolay Kulikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
Самое интересное что возможность исользовать SP на СLR .Net первым сделал IBM а не Microsoft :)
...
Рейтинг: 0 / 0
27.01.2004, 13:05
    #32388958
locky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнительный анализ MS Sql и другие...
автор
Самое интересное что возможность исользовать SP на СLR .Net первым сделал IBM а не Microsoft :)

Ну, ведь и IBM надо хоть что-то делать, правда? ;-)
Не выходит с SQL, переключимся на процедурные языки....
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие... / 25 сообщений из 82, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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