Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2015, 15:36   #21
bidzina
Подтвердите свой е-майл
 
Регистрация: 10.01.2013
Сообщений: 16
Вопрос

Цитата:
Сообщение от evg_m Посмотреть сообщение
т.е. нужны уникальные ключи для всех таблиц (непересекающиеся значения)
00001-10000 первая
10001-20000 вторая
20001-30000 третья и т.д.
решается начальным значением генератора либо триггером insert

или же использовать составной ключ (level, id)
или вычислимое поле "numtable" * 100000 +key


Код:
select 0*100000 +id, name, 0 as parent_id from t1
union
select 1*100000 +id, name, 0*10000+parent_id from t2
union 
select 2*100000 +id, name, 1*10000+parent+id from t3
P.S. конечно же надо "гарантировать" что id всех используемых таблиц не выйдет за границу 1..100000(0..99999)

P.P.S. а единая таблица сразу решает проблему DBTree.
evg_m,пишу запрос:
Код:
select 0*100000 +id, name, 0 as parent_id from t1
union
select 1*100000 +id, name, 0*100000+parent_id from t2
union 
select 2*100000 +id, name, 1*100000+parent_id from t3
и получаю:

Код:
Invalid command
Data type unknown
bidzina вне форума Ответить с цитированием
Старый 29.01.2015, 16:00   #22
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
0*100000
может с простого начнете?
lomastr_ вне форума Ответить с цитированием
Старый 29.01.2015, 16:22   #23
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select 0+id, 10000+id, 20000+parent_id ....
проходит?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.01.2015, 16:38   #24
bidzina
Подтвердите свой е-майл
 
Регистрация: 10.01.2013
Сообщений: 16
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
0*100000
Цитата:
Цитата: может с простого начнете?
lomastr_, 1*100000 -та же ошибка!
Легко умудренным видом давать советы, не разбирая в сут вопроса. 2 дня спрашиваешь зачем Level-и, я отвечаю и отвечаю, даю линк на статью насчёт "структур с потабличным хранением уровней иерархии" и снова и снова спрашиваешь.
2 дня обясняешь, что иерархия очень простой вещь- id,parent_id,name! Неужели? Ура! Вопрос решен!
Цитата:
иерархия в таблице это просто
ид, найм, парент ид, ...
И думаешь это большое обнаружение? Думаешь так легко создать иерархию из 5 таблиц? Легко когда выбираешь из одной таблицы, где Parent_id четко указывает на предка, а когда таблиц несколько, их Parent_id оказываются уже неуникальными в собранном запросом таблице.

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select 0+id, 10000+id, 20000+parent_id ....
проходит?
evg_m, отдельно все проходят-
Цитата:
и select 0*100000 +id, name, 0 as parent_id from t1, то есть 0*100000 не причем
и
Цитата:
select 1*100000 +id, name, 0*100000+parent_id from t2
и
Цитата:
select 2*100000 +id, name, 1*100000+parent_id from t3 тоже,
а вот в Union уже нет!

Последний раз редактировалось Stilet; 29.01.2015 в 18:12.
bidzina вне форума Ответить с цитированием
Старый 29.01.2015, 17:03   #25
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А как там mysql 0 as parent_id интерпретирует из первого запроса? Может стоит явно 0 к типу integer привести?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2015, 17:14   #26
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
а когда таблиц несколько, их Parent_id оказываются уже неуникальными в собранном запросом таблице.
даже в 1 таблице не уникален

Цитата:
отвечаю, даю линк на статью насчёт "структур с потабличным хранением уровней иерархии"
я не спрашивал про линки, спрашивал про вашу задачу
впрочем пофик
lomastr_ вне форума Ответить с цитированием
Старый 29.01.2015, 18:11   #27
bidzina
Подтвердите свой е-майл
 
Регистрация: 10.01.2013
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А как там mysql 0 as parent_id интерпретирует из первого запроса? Может стоит явно 0 к типу integer привести?
Не MySql а Interbase 2009.
Код:
select 0*100000 +id, name, cast(0 as integer) as  parent_id from t1
union
select 1*100000 +id, name, 0*100000+parent_id from t2
union
select 2*100000 +id, name, 1*100000+parent_id from t3
опять Invalid command
Data type unknown

Код:
Хотя отдельно 
и select 0*100000 +id, name, 0  as  parent_id from t1
и select 0*100000 +id, name, cast(0 as integer) as  parent_id from t1
правильно работает:
F_1    Name        Parent_id
1        BBB ltd      0
2        AAA ltd      0
P.S. А если
Код:
select 1*100000 +id, name, 0*100000+parent_id from t2
union
select 2*100000 +id, name, 1*100000+parent_id from t3
тоже без ощибки проходит, явно в первом селекте проблема!
bidzina вне форума Ответить с цитированием
Старый 29.01.2015, 18:35   #28
bidzina
Подтвердите свой е-майл
 
Регистрация: 10.01.2013
Сообщений: 16
По умолчанию

всё, сработал:
Код:
select 0*100000 +id, name, 0*0 as parent_id from t1
union
select 1*100000 +id, name, 0*100000+parent_id from t2
union
select 2*100000 +id, name, 1*100000+parent_id from t3


спасибо streletz, stilet,evg_m, Аватар!!!

Таким образом, с вашей помощью решена проблема связывания нескольких таблиц и на основе полученного запроса создания дерева! То есть я создаю отдельно таблицы:firms, branches, departaments, warehouses, стеллажи,Ящики и т.д.
А насчёт 2 дерева никак? Чтобы в таблице MyFirms объединить firms, branches, departaments, а в warehouses-warehouses, стеллажи,Ящики и т.д.? По-вашему это реально? Нигде ни одного приблизительного решения не нашел. Что можете посоветовать?

Последний раз редактировалось bidzina; 29.01.2015 в 18:56.
bidzina вне форума Ответить с цитированием
Старый 29.01.2015, 19:18   #29
bidzina
Подтвердите свой е-майл
 
Регистрация: 10.01.2013
Сообщений: 16
По умолчанию

Почему склонюсь к двум иерархиям:
1.firms, branches, departaments одна сушность и должен быть вместе, а склады, стеллажи, ящики и т.д.-вместе.
2. Если фирме понадобиться не стеллажи и ящики а боксы,или склад размешен на несколько этажи, тогда придется добавить новые таблицы?!- проблема расширении!
Что вы думаете на счёт этого?
bidzina вне форума Ответить с цитированием
Старый 29.01.2015, 20:35   #30
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
проблема расширении!
Еще какая...
Цитата:
Что вы думаете на счёт этого?
Иерархическая СУБД )
Не ну ей богу... Смотря на такие задачи мне все больше начинают нравиться Cashe и Lotus.
Я вообще не понимаю какой смысл делать то, что по условию не должно развиваться.

Впрочем могу поделиться технологией, которую использует одна из ПО, с которой я работаю.
Там есть "детали" (ну к примеру) и сборки. У каждой детали или сборки свой уникальный 21 значный код. Каждые три знака обозначают родителя.
Допустим:

001 коробка
002 крышка
003 кошка
004 мышка
005 мышеловка

Соответственно деталь "Мышка попалась" имеет ID код 004003001000 или код 004005001000

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

P.S. Хотя если использовать что-то типа varchar(max) то порог вложения будет поистине бесконечен...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как разработать ИС предприятия? SrgKord Общие вопросы по программированию, компьютерный форум 5 07.02.2014 10:44
Delphi7 - как связывать таблицы hunter08923 Помощь студентам 0 22.05.2012 12:05
ящики не желают падать серг Общие вопросы C/C++ 1 06.12.2010 22:34