powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / КЛАДР
45 сообщений из 45, показаны все 2 страниц
КЛАДР
    #36669847
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с такой проблемой в КЛАДР.
Есть данные, актуальные и неактуальные.
При прописывании в таблице родителя объекту, столкнулся с проблемой -

ID NAME SOCR CODE IND GNINMB UNO OCATD STATUS

Санкт-Петербург г 7800000000000 190000 7800 40000000000 0
Ленинград г 7800000000001 190000 7800 40000000000 0
Петергоф г 7800000800000 198510 7819 40290501000 0
Петродворец г 7800000800001 198510 7819 40290501000 0

из этого списка - два объекта активные, два другие - нет.
проблема следующая - и Петергоф и Петродворец - я привязал к Санкт-Петербургу.

Как определить, к какому объекту прикреплять актуальный/неактуальный объект???
Может Петродворец должен быть связан с Ленинградом?
...
Рейтинг: 0 / 0
КЛАДР
    #36669876
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкКак определить, к какому объекту прикреплять актуальный/неактуальный объект???
Может Петродворец должен быть связан с Ленинградом?Просто выкиньте неактуальные элементы классификатора. Если бы в КЛАДРе еще ALTNAMES.DBF велся по-человечьи.
...
Рейтинг: 0 / 0
КЛАДР
    #36669895
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

нельзя так.

если вбиваю паспортные данные, к примеру человека, который получал его еще в Ленинграде, получается такого города просто нет( - это уже неправильно.
история должна сохраниться.


мне подсказывают, что просто надо привязать неактуальный объект в актуальному - то есть и Петергоф и Петродворец к Санкт-Петербургу.
...
Рейтинг: 0 / 0
КЛАДР
    #36670021
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорёкмне подсказывают, что просто надо привязать неактуальный объект в актуальному - то есть и Петергоф и Петродворец к Санкт-Петербургу.Тогда у Вас адресная строка получается:
Код: plaintext
Санкт-Петербург, Петергоф
а такого адреса никогда не существовало. Ерунда получается. Можно, конечно, поискать город со статусом "....1", т.е. Ленинград, но в общем случае восстановить не получится. Я пробовал - потом забил. Поймите, КЛАДР ведется с потерей данных об истории и восстановить адреса какими они были прежними - дело проблематичное.
...
Рейтинг: 0 / 0
КЛАДР
    #36670032
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_Lпоискать город со статусом "....1"читать как поискать город со статусом "01". там же на статус 2 цифры отводится. А есть еще "99", и еще какие-то имеются...
...
Рейтинг: 0 / 0
КЛАДР
    #36670037
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

да все верно.
но судя по описанию кода, который приводят в КЛАДР, все=таки
Санкт-Петербург - это отдельный субъект РФ, а вот Петергоф - входит в субъект СПб.

это ведь для построения дерева.
...
Рейтинг: 0 / 0
КЛАДР
    #36670270
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкSenya_L,

да все верно.
но судя по описанию кода, который приводят в КЛАДР, все=таки
Санкт-Петербург - это отдельный субъект РФ, а вот Петергоф - входит в субъект СПб.

это ведь для построения дерева.Я понимаю, что для дерева. Но при нахождении родителя возникает неоднозначность - вот я к чему клоню. По на роль родителя для Петергофа подходит как Ленинград, так и Петербург. Как выбрать правильный запросом? Я не придумал. Но у меня адреса вбиваются только актуальные и "петергофы" не ребуются
...
Рейтинг: 0 / 0
КЛАДР
    #36670284
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорёкно судя по описанию кода, который приводят в КЛАДР, все=таки
Санкт-Петербург - это отдельный субъект РФ, а вот Петергоф - входит в субъект СПб.В КЛАДРе не отслеживается хронология изменения элементов.

С 1944 по 1991 правильный адрес: Ленинград, Петродворец
С 1991 по 2009 правильный адрес Петербург, Петродворец
С 2009 и > правильный адрес: Петербург, Петергоф

Ферштейн, где собака порылась?
...
Рейтинг: 0 / 0
КЛАДР
    #36670483
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

тогда проще вести все данные, только использовать столбец актуальности для данного вида информации.
...
Рейтинг: 0 / 0
КЛАДР
    #36670507
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкSenya_L,

тогда проще вести все данные, только использовать столбец актуальности для данного вида информации.Тогда у Вас древа не получится
...
Рейтинг: 0 / 0
КЛАДР
    #36670839
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L,
Почему не получится? Просто дерево чуть более сложное будет. По сути получится узел с кодом объекта, к которому привяжутся с одной стороны все его наименования, а с другой - подчиненные объекты.

IMHO, в текущей реализации КЛАДР неактуальные данные нужны только для ввода старых исходных данных, т.е. поиск кода объекта по наименованию, а это можно и на основе отдельной таблицы сделать.
...
Рейтинг: 0 / 0
КЛАДР
    #36670893
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevSenya_L,
Почему не получится? Просто дерево чуть более сложное будет. По сути получится узел с кодом объекта, к которому привяжутся с одной стороны все его наименования, а с другой - подчиненные объекты.Это уже не древо. Это уже многие-ко-многим.
...
Рейтинг: 0 / 0
КЛАДР
    #36670895
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LKirill RazuvaevSenya_L,
Почему не получится? Просто дерево чуть более сложное будет. По сути получится узел с кодом объекта, к которому привяжутся с одной стороны все его наименования, а с другой - подчиненные объекты.Это уже не древо. Это уже многие-ко-многим.Невнимательно прочитал Ваше сообщение. Теперь врубился. Интересная мысль. Но мне требуются только актуальные адреса, так что... Но запомню на будущее.
...
Рейтинг: 0 / 0
КЛАДР
    #36670920
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял Кирилла, то получается такая структура
Код: 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.
if object_id('KladrItem', 'U') is not null
	drop table KladrItem;
if object_id('Prefix', 'U') is not null
	drop table Prefix;
if object_id('Kladr', 'U') is not null
	drop table Kladr;

create table Kladr(
	KladrID int not null identity( 1 ,  1 ),
	ParentID int null,
	constraint PK_Kladr primary key nonclustered(KladrID),
	constraint FK_Kladr_Kladr foreign key(ParentID) references Kladr(KladrID)
);
create unique clustered index clst on Kladr(ParentID, KladrID);


create table Prefix(
	PrefixID smallint not null,
	level tinyint not null,
	Name varchar( 10 ) not null,
	FullName varchar( 29 ) not null,
	Dot bit constraint DF_Prefix_Dot default( 0 ),
	constraint PK_Prefix primary key(PrefixID)
);

create table KladrItem(
	KladrID int not null,
	PrefixID smallint not null,
	Name varchar( 40 ) not null,
	Code varchar( 19 ) not null,
	PostIndex char( 6 ) null,
	GNINMB char( 4 ) null,
	UNO char( 4 ) null,
	OCATD char( 11 ) null,
	Status char( 1 ) not null,
	constraint PK_KladrItem primary key(KladrID, Status), -- ??? Status
	constraint FK_KladrItem_Prefix foreign key(PrefixID) references Prefix(PrefixID),
	constraint FK_KladrItem_Kladr foreign key(KladrID) references Kladr(KladrID)
);
create unique index IX_Code on KladrItem(Code);
...
Рейтинг: 0 / 0
КЛАДР
    #36671558
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LЕсли я правильно понял Кирилла, то получается такая структура Да, что-то типа того. Я, правда, делал по-другому , ввиду исторической нелюбви к флоре :-)
...
Рейтинг: 0 / 0
КЛАДР
    #36671654
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevSenya_LЕсли я правильно понял Кирилла, то получается такая структура Да, что-то типа того. Я, правда, делал по-другому , ввиду исторической нелюбви к флоре :-)Да, я помню тот топик. А мне не нравится раскидывание КЛАДРА на несколько таблиц. Намного удобнее хранить адресную ссылку, получать строку адреса. Лично я вообще слил в одну таблицу и KLADR.DBF, и STREET.DBF. Приведенный выше скрипт сделан на основе реально используемого загрузчика в MSскульную БД.
...
Рейтинг: 0 / 0
КЛАДР
    #36672050
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LДа, я помню тот топик. А мне не нравится раскидывание КЛАДРА на несколько таблиц. Намного удобнее хранить адресную ссылку, получать строку адреса.Да, естественно! Чем мешает несколько таблиц? Точно также вытаскиваем все, что нужно, только из ХП... Выбор здесь скорее из области любви к красному цвету и к зеленому... Меня в исходном КЛАДРе притомила слегка необходимость вычислять уровень, отсюда и разбивка на уровни по таблицам взялась, опять же проще сокращения прикручивать и корректировать (контролировать корректность)... :-)
...
Рейтинг: 0 / 0
КЛАДР
    #36672163
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevМеня в исходном КЛАДРе притомила слегка необходимость вычислять уровень, отсюда и разбивка на уровни по таблицам взялась, опять же проще сокращения прикручивать и корректировать (контролировать корректность)... :-)Напрасно :-) Не претендуя на изящество:
Код: 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.
;with cte as(
	select
		Kladr.KladrID as KladrID0,
		Kladr.KladrID,
		Kladr.ParentID,
		Kladr.Name as Name,
		Kladr.PostIndex,
		Prefix.level
	from Kladr
		join Prefix on Kladr.PrefixID = Prefix.PrefixID
	where KladrID = :KladrID
	union all
	select
		cte.KladrID0,
		Kladr.KladrID,
		Kladr.ParentID,
		Kladr.Name as Name,
		PostIndex = coalesce(cte.PostIndex, Kladr.PostIndex),
		Prefix.level
	from Kladr
		join Prefix on Kladr.PrefixID = Prefix.PrefixID
		join cte on Kladr.KladrID = cte.ParentID	
)
select top  1 
	cte.KladrID0,
	A1.KladrID as KladrID1,
	A2.KladrID as KladrID2, 
	A3.KladrID as KladrID3,
	A4.KladrID as KladrID4,
	A5.KladrID as KladrID5,
	A1.Name as Name1,
	A2.Name as Name2,
	A3.Name as Name3,
	A4.Name as Name4,
	A5.Name as Name5,
	cast(null as varchar( 10 )) as HouseNumber,
	cast(null as varchar( 10 )) as HouseCorp,
	cast(null as varchar( 10 )) as Flat,
	cte.PostIndex
from cte
	outer apply(select KladrID, Name from cte where level= 1 ) A1
	outer apply(select KladrID, Name from cte where level= 2 ) A2
	outer apply(select KladrID, Name from cte where level= 3 ) A3
	outer apply(select KladrID, Name from cte where level= 4 ) A4
	outer apply(select KladrID, Name from cte where level= 5 ) A5
...
Рейтинг: 0 / 0
КЛАДР
    #36675953
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LНапрасно :-) Не претендуя на изящество:Ни асилил... слишком много букоф... :-)
P.S. Тот вопрос, что был - решен, нет смысла менять. А "будет день - будет пища"... :-)
...
Рейтинг: 0 / 0
КЛАДР
    #36676645
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevSenya_LНапрасно :-) Не претендуя на изящество:Ни асилил... слишком много букоф... :-)Что букафф много я уже потом сам увидел Этот запрос раскидает древовидный кладр (та флора, шо ты не любишь;)) по 5 уровням. Там на самом деле много лишнего балласта. Простой копипаст не в кон.
Kirill RazuvaevP.S. Тот вопрос, что был - решен, нет смысла менять. А "будет день - будет пища"... :-)Если работает - то не трогай. Просто автор изначально настроен был на древо и зачем ему мешать. Особенно, если я с ним согласен
...
Рейтинг: 0 / 0
КЛАДР
    #36677926
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,


я в принципе уже залил информацию в БД, если интересно, могу показать структуру таблиц
...
Рейтинг: 0 / 0
КЛАДР
    #36677951
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкSenya_L,


я в принципе уже залил информацию в БД, если интересно, могу показать структуру таблицИнтересно будет сравнить. И для потомков, если не жалко выложите скрипты преобразования. КЛАДР - тема всерьез и надолго =).
...
Рейтинг: 0 / 0
КЛАДР
    #36681603
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
завтра, то бишь в пятницу буду на работе - опубликую скрипты на создание таблиц, заливка данных пока хромает - грузит дубли - думаю, на днях исправлю и следом закину.
...
Рейтинг: 0 / 0
КЛАДР
    #36684036
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда я опубликую
Создание временных таблиц, в которые заливаем банные массовой вставкой. Данные таблиц предвариельно выгружаем в plain-файл.
Код: 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.
use tempdb;

if object_id('o_SOCRBASE') is not null
	drop table o_SOCRBASE;

create table o_SOCRBASE(
	level tinyint null,
	SCNAME varchar( 10 ) null,
	SOCRNAME varchar( 29 ) null,
	KOD_T_ST int null
);


if object_id('o_KLADR') is not null
	drop table o_KLADR;

create table o_KLADR(
	NAME varchar( 40 ) null,
	SOCR varchar( 10 ) null,
	CODE char( 13 ) null,
	[INDEX] char( 6 ) null,
	GNINMB char( 4 ) null,
	UNO CHAR( 4 ) null,
	OCATD char( 11 ) null,
	[STATUS] char( 1 ) null
);

if object_id('o_STREET') is not null
	drop table o_STREET;

create table o_STREET(
	NAME varchar( 40 ) null,
	SOCR varchar( 10 ) null,
	CODE char( 17 ) null,
	[INDEX] char( 6 ) null,
	GNINMB char( 4 ) null,
	UNO CHAR( 4 ) null,
	OCATD char( 11 ) null
);


if object_id('o_ALTNAMES') is not null
	drop table o_ALTNAMES;

create table o_ALTNAMES(
	OLDCODE varchar( 19 ) null,
	NEWCODE varchar( 19 ) null,
	LEVEL tinyint null
);
Рабочие таблицы. Создаются в контексте соединения с требуемой БД. Индексы и ограничения лучше создавать после массовой вставки из текстовых файлов.
Код: 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.
create table Prefix(
	PrefixID smallint not null,
	level tinyint not null,
	Name varchar( 10 ) not null,
	FullName varchar( 29 ) not null,
	Dot bit constraint DF_Prefix_Dot default( 0 )
);



create table Kladr(
	KladrID int  identity( 1 ,  1 ),
	ParentID int null,
	PrefixID smallint not null,
	Name varchar( 40 ) not null,
	Code varchar( 19 ) not null,
	PostIndex char( 6 ) null,
	GNINMB char( 4 ) null,
	UNO char( 4 ) null,
	OCATD char( 11 ) null,
	Status char( 1 ) null
);

GO

create unique clustered index clst on Prefix(PrefixID);
create unique clustered index clst on Kladr(ParentID, KladrID);
create unique index IX_Code on Kladr(Code);

alter table Prefix add constraint PK_Prefix primary key nonclustered(PrefixID);


alter table Kladr add constraint PK_Kladr primary key nonclustered(KladrID);
alter table Kladr add constraint FK_Kladr_Prefix foreign key(PrefixID) references Prefix(PrefixID);
alter table Kladr add constraint FK_Kladr_Kladr foreign key(ParentID) references Kladr(KladrID);
Запросы на преобразование (неактивные элементы классификатора отбрасываются)
Код: 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.
-- индексы на временные таблицы
create unique clustered index clst on o_KLADR(Code)
create unique clustered index clst on o_STREET(Code)

GO
-- префиксы
insert into Prefix(PrefixID, level, Name, FullName)
select
	KOD_T_ST, level, SCNAME, SOCRNAME
from tempdb..o_SOCRBASE


-- уровень 1
insert into Kladr(ParentID, PrefixID, Name, Code, PostIndex, GNINMB, UNO, OCATD, Status)
select
	null, P.PrefixID, K.NAME, K.CODE, K.[INDEX], K.GNINMB, K.UNO, K.OCATD, K.Status
from tempdb..o_KLADR K
	join Prefix P on K.SOCR = P.Name and P.level =  1 
where 
	CODE like '__00000000000'
	and not exists(
		select * from Kladr where Code = K.CODE
	)
order by K.Code

-- уровень 2
insert into Kladr(ParentID, PrefixID, Name, Code, PostIndex, GNINMB, UNO, OCATD, Status)
select
	PK.KladrID, P.PrefixID, K.NAME, K.CODE, K.[INDEX], K.GNINMB, K.UNO, K.OCATD, K.Status
from tempdb..o_KLADR K
	join Prefix P on K.SOCR = P.Name and P.level =  2 
	join Kladr PK on left(K.Code,  2 ) = left(PK.Code,  2 ) and right(PK.Code,  2 ) = '00'
where 
	K.CODE like '_____00000000' and K.CODE not like '__00000000000'
	and not exists(
		select * from Kladr where Code = K.CODE
	)
order by K.Code


-- уровень 3
insert into Kladr(ParentID, PrefixID, Name, Code, PostIndex, GNINMB, UNO, OCATD, Status)
select
	PK.KladrID, P.PrefixID, K.NAME, K.CODE, K.[INDEX], K.GNINMB, K.UNO, K.OCATD, K.Status
from tempdb..o_KLADR K
	join Prefix P on K.SOCR = P.Name and P.level =  3 
	join Kladr PK on left(K.Code,  5 ) = left(PK.Code,  5 ) and right(PK.Code,  2 ) = '00'
where 
	K.CODE like '________00000' and K.CODE not like '_____00000000' and K.CODE not like '__00000000000'
	and not exists(
		select * from Kladr where Code = K.CODE
	)
order by K.Code

-- уровень 4
insert into Kladr(ParentID, PrefixID, Name, Code, PostIndex, GNINMB, UNO, OCATD, Status)
select
	PK.KladrID, P.PrefixID, K.NAME, K.CODE, K.[INDEX], K.GNINMB, K.UNO, K.OCATD, K.Status
from tempdb..o_KLADR K
	join Prefix P on K.SOCR = P.Name and P.level =  4 
	join Kladr PK on left(K.Code,  8 ) = left(PK.Code,  8 ) and right(PK.Code,  2 ) = '00' and K.CODE != PK.Code
where 
	K.CODE like '___________00' and K.CODE not like '________00000' 
		and K.CODE not like '_____00000000' and K.CODE not like '__00000000000'
	and not exists(
		select * from Kladr where Code = K.CODE
	)
order by K.Code

-- уровень 5
	insert into Kladr(ParentID, PrefixID, Name, Code, PostIndex, GNINMB, UNO, OCATD, Status)
	select
		PK.KladrID, P.PrefixID, S.NAME, S.CODE, S.[INDEX], S.GNINMB, S.UNO, S.OCATD, null
	from tempdb..o_STREET S
		join Prefix P on S.SOCR = P.Name and P.level =  5 
		join Kladr PK on left(S.Code,  11 ) = left(PK.Code,  11 ) and right(PK.Code,  2 ) = '00' and S.CODE != PK.Code
	where 
		right(S.Code,  2 ) = '00'
		and not exists(
			select * from Kladr where Code = S.CODE
		)
order by S.Code


2Кирилл Разуваев, мы совсем забыли, что кроме переименования, для элемента КЛАДР еще возможны слияния, удаления и пр. :(
...
Рейтинг: 0 / 0
КЛАДР
    #36684176
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L... в которые заливаем банные массовой вставкой... Оговорочка-то - по Фрейду... ;-)

2Кирилл Разуваев, мы совсем забыли, что кроме переименования, для элемента КЛАДР еще возможны слияния, удаления и пр. :(Не помню, честно говоря, как в КЛАДР описаны правила слияния, а вот по удалению не вижу особых проблем. Удаление данных без подчиненных сводится к установке флага, в случае же наличия подчиненных - нужно разбираться. Варианта событий я вижу два: удаление с подчиненными (удаление "мертвых" населенных пунктов) и удаление узла с переподчинением или даже слиянием подчиненных (смена административного деления). Первый обсуждать особого смысла нет, ибо легко решается в любом из (обсуждаемых) вариантов реализации. А вот реализацию второго - есть сомнения, что удастся автоматизировать в силу нестабильности исходных данных... Хотя, возможно, кто-то сможет предложить довольно общее решение. Короче, нужно попробовать преобразовать дерево в граф посредством интеграции altnames.dbf
...
Рейтинг: 0 / 0
КЛАДР
    #36684179
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevSenya_L... в которые заливаем банные массовой вставкой... Оговорочка-то - по Фрейду... ;-)
Kirill Razuvaev 2Кирилл Разуваев, мы совсем забыли, что кроме переименования, для элемента КЛАДР еще возможны слияния, удаления и пр. :(Не помню, честно говоря, как в КЛАДР описаны правила слияния, а вот по удалению не вижу особых проблем. Удаление данных без подчиненных сводится к установке флага, в случае же наличия подчиненных - нужно разбираться. Варианта событий я вижу два: удаление с подчиненными (удаление "мертвых" населенных пунктов) и удаление узла с переподчинением или даже слиянием подчиненных (смена административного деления). Первый обсуждать особого смысла нет, ибо легко решается в любом из (обсуждаемых) вариантов реализации. А вот реализацию второго - есть сомнения, что удастся автоматизировать в силу нестабильности исходных данных... Хотя, возможно, кто-то сможет предложить довольно общее решение. Короче, нужно попробовать преобразовать дерево в граф посредством интеграции altnames.dbfИнтеграция с ALTNAMES под большим вопросом, потому как есть подозрение, что таблица неполная. Сейчас искать не буду, а когда разбирался годика 2 назад такие элементы видел. Хотя... может и поправили к настоящему времени.
...
Рейтинг: 0 / 0
КЛАДР
    #36701253
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как и обещал, но с небольшой задержкой.

эти скрипты создают два типа таблиц.
1. в которые я просто 1:1 импортирую данные из КЛАДР - они не реляционные.
2. уже принадлежат нашей базе. они связаны между собой.
...
Рейтинг: 0 / 0
КЛАДР
    #36701256
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а эти скрипты уже импортируют данные в наши таблицы.
скриптов для КЛАДР нет, так как я заливаю их простым ctrl+c - cttrl+v.
...
Рейтинг: 0 / 0
КЛАДР
    #36701297
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ошибочка вышла,
создание таблиц - вот верный скрипт.
...
Рейтинг: 0 / 0
КЛАДР
    #36701525
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорёкошибочка вышла,
создание таблиц - вот верный скрипт.Я только взглянул на скрипт и мне стало плохо. Можно сказать вырвало на это:
Код: plaintext
NUMBER( 22 , 10 )
Если я правильно понимаю синтаксис Oracle - это аналог NUMERIC(22,10)? Мусье, однако, извращенец...
...
Рейтинг: 0 / 0
КЛАДР
    #36701536
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее без эмоций. Вы просто содрали структуру оригинального КЛАДР, что не делает Вам чести. Просто содрали и добавили поле ID с непонятного назначения типом данных (кстати, что оно поменяло в данном случае - загадка?). Как связать Z_STREET и Z_KLADR? По CODE? Просто зашибись.

ЗЫ. Вы на эту дрянь потратили 2 недели???
...
Рейтинг: 0 / 0
КЛАДР
    #36701696
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

уважаемый, если бы Вы читали внимательнее и просмотрели весь скрипт целиком - вы бы не писали этого поста)

во-первых, я написал, что первые таблицы, а именно, z_kladr, z_street, z_altnames, z_socrbase, z_doma - я создал, чтобы просто туда внести данные из кладр.

"эти скрипты создают два типа таблиц.
1. в которые я просто 1:1 импортирую данные из КЛАДР - они не реляционные.
2. уже принадлежат нашей базе. они связаны между собой."(см. выше)

а столбик ID - да, NUMBER(22,10) - он вообще не используется и не нужен,- просто забыл его удалить из скрипта.

во-вторых, ниже все в том же скрипте create_all_tables написано создание других таблиц, а именно тех, которые между собой связаны ;) (об это я тоже писал)

а в-третьих, вы хотя бы смотрели файл import_to_IIAS.sql? там вроде бы все написано.
если не хотите читать и смотреть, объясню на пальцах - из 5 таблиц КЛАДР я сделал 3 своих таблицы(на самом деле их 4, четвертая - таблица сокращений, она уже создана, я просто в нее внес свои значения - а именно - сокращения из z_socrname(искл. дубли) и присвоил каждому значению уник. код - то бишь id, если точнее vd_id)
первая,= K_ADDRESS_NAME - содержит все имена и код сокращения(vd_vd_id) из таблиц z_kladr и z_street (исключая дубли).
вторая,= Z_REG_ADDRESS - поддерживает связь самой с собой (то есть устанавливает отношения PARENT-CHILD), чтобы построить цепь связей - какой объект относится к какому: дом-улица-регион-субъект и так далее. содержит так же уровни - от 1 до 5. 1-4 - субъекты, регионы, нас. пункты, 5 - улица.
третья,= Z_BUILDINGS - только дома, связь с таблицей Z_REG_ADDRESS по reg_id.


надеюсь что-нибудь прояснислось, Мусье?
...
Рейтинг: 0 / 0
КЛАДР
    #36701701
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
завтра я помещу скрины на которых буду нарисованы связи между таблицами, по какому полю и скрин - на нем будет пример заполнения таблиц, хотя бы одного из регионов ;)

думаю, что глупые вопросы и утверждения относительно моего потерянного времени отпадут)
...
Рейтинг: 0 / 0
КЛАДР
    #36702471
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
связь таблиц
...
Рейтинг: 0 / 0
КЛАДР
    #36707151
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорёкзавтра я помещу скрины на которых буду нарисованы связи между таблицами, по какому полю и скрин - на нем будет пример заполнения таблиц, хотя бы одного из регионов ;)

думаю, что глупые вопросы и утверждения относительно моего потерянного времени отпадут)Вопросы не то чтобы отпали. Все равно г... Как вы лодку назовете - так она и поплывет. Вы ее назвали NUMBER(22,10). Дальше не о чем говорить.
...
Рейтинг: 0 / 0
КЛАДР
    #36707427
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,


а-ха-ха))))))
...
Рейтинг: 0 / 0
КЛАДР
    #36711616
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senay_L,

зато другим пользователям поможет, если они столкнутся с такой задачей.
...
Рейтинг: 0 / 0
КЛАДР
    #36714243
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкSenay_L,

зато другим пользователям поможет, если они столкнутся с такой задачей.Это вряд ли. Скорее навредит. Для начала расскажи, как можно определить префикс у элемента классификатора, т.е это "ул" или "г", или "проспект"? А также расскажи: за какое место надо подвешивать автора, обзывающего поля именем "AN_AN_ID" итп? Здесь один типаж уверял, что один факт работы с Oracle "дисциплинирует". Это брехня.
...
Рейтинг: 0 / 0
КЛАДР
    #36717683
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

1. чем тебя AN_AN_ID не устраивает?
2. таблица o_value_directory, столбец code, так и узнаешь.
...
Рейтинг: 0 / 0
КЛАДР
    #36720724
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХорёкSenya_L,

1. чем тебя AN_AN_ID не устраивает?
2. таблица o_value_directory, столбец code, так и узнаешь.
хорошо. я убил в себе агрессию. и ты молодец, что еще отвечаешь ;)

Пойми, ты вываливаешь структуру, а никто не знает твоего (тонкого) замысла. И имена идентификаторов дают очень мало. Задумка видна смутно и прочие проектировщики мало поймут, что ты хотел сказать. Помимо AN_AN_ID есть и другие столбцы непонятного назначения. Зачем они? Для собственных нужд или они critically needed?
...
Рейтинг: 0 / 0
КЛАДР
    #36730147
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

будет время - опишу подробнее.
...
Рейтинг: 0 / 0
КЛАДР
    #36731769
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
начнем.

таблица o_value_directory
все сокращения из socbase.dbf
vd_id = id сокращения (PK)
code = сокращенное название
value = полное название

таблица k_address_name
наименования адресных объектов из kladr.dbf, street.dbf (исключая дубли)
an_id = address_name_id (id по названию таблицы)(PK)
adr_name = наименование адресных объектов
vd_vd_id = id сокращения из o_value_directory

таблица k_reg_address
то же, что и k_address_name, только содержит полностью все объекты от 1 до 4 уровня ( то есть дома и улицы не входят ).
используются только id, никаких названий.
это таблица, в которой используется parent-child связь (reg_id - reg_reg_id)

таблица k_buildings
таблица из DOMA.dbf
связь по reg_id
build_id = PK
build_numbers = строка домов (char).

вкратце.
...
Рейтинг: 0 / 0
КЛАДР
    #36731772
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ошибочка

таблица k_reg_address
содержит полностью все объекты от 1 до 5 уровня (то есть дома не входят).
...
Рейтинг: 0 / 0
КЛАДР
    #36780963
wildwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорёк,

Интересно сравнить со своей и другими поделками.

Вопросы.

* Из каких соображений две таблицы k_address_name, k_reg_address вместо одной. И из каких соображений атрибуты разделены именно так.

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

* Каково назначение кучи атрибутов в o_value_directory, которые явно не из КЛАДРа

* Актуализация данных из КЛАДРа предусмотрена?
...
Рейтинг: 0 / 0
КЛАДР
    #36791713
Хорёк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wildwind,
* Из каких соображений две таблицы k_address_name, k_reg_address вместо одной. И из каких соображений атрибуты разделены именно так.

k - значит КЛАДР ( чтобы проще было найти в БД ;) )

address_name - значит, что только адресны названия объектов хранятся.

reg_address - данные, контакная информация (индекс, налоговая и т.д.)

k_address_name - это таблица которая содержит только уникальные названия парой (название + код_объекта)

k_reg_address - эта таблица содержит уже полную информацию об объекте - только там хранятся не названия объектов - коды - или переводя на язык - id (от 1 до 5 уровня - то есть регион и далее ...до улицы).

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

с этим проблем у не было - так как была уже создана таблица, в которой хранится информация, которая делится по виду - телефон, адрес, место работы и т.д. коды соот в другой таблице.

а хранится все просто в строке, через запятую...в виде:
Россия, 196191, Санкт-Петербург г,,,,Новоизмайловский пр-т,24,2,56
+ в таблице присутствует признак ввода информации из КЛАДР (ноль или один)

* Каково назначение кучи атрибутов в o_value_directory, которые явно не из КЛАДРа

эта таблица была уже в базе - я ее использую не полностью - только пару значений.
(vd_id, code, value, dir_dir_id *ссылка на другую таблицу, где пометка, что это сокращения из КЛАДР(таблица КЛАДР - z_socrbase)* и еще пару столбцов, с пометкой о связи этих данных с другой таблицей)

* Актуализация данных из КЛАДРа предусмотрена

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



само задание предусмотрено для работы в оракл формс)
а форма сделана по принципу как сделано в 1С. когда вбиваешь адрес.
а потом пишет в таблице просто строку через запятую.


номера домов я тоже храню строкой, просто потом парсирую ее, как надо.
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / КЛАДР
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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