powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Еще раз про кладр
2 сообщений из 2, страница 1 из 1
Еще раз про кладр
    #38871982
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.



нашел такую статейку

http://mik-demidov.blogspot.ru/2014/02/kladr-firebird.html

перелил все данные как в ней.

сделал вьюхи

регионы
Код: plsql
1.
2.
3.
4.
5.
create view regions_view ( NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST
 )
as
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr
where code1 <> 0 and code2 = 0 and code3 = 0 and code4 = 0


районы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR ALTER VIEW DISTRICTS_VIEW(
    NAME,
    SOCR,
    CODE,
    INDEXX,
    CODE1,
    CODE2,
    CODE3,
    CODE4,
    KOD_T_ST)
AS
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr
where
--code1 = 60 and
code2 <> 0 and code3 = 0 and code4 = 0
;


города
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE OR ALTER VIEW SITIES_VIEW(
    NAME,
    SOCR,
    CODE,
    INDEXX,
    CODE1,
    CODE2,
    CODE3,
    CODE4,
    KOD_T_ST)
AS
--города области (только города, которые относятся к районнным) -
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr
where
--code1 = 60 and
code4 = 0  and  code3 <> 0 and code2 <> 0

union all

--города области (НЕ РАЙОННЫЕ) -
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr
where
--code1 = 60 and
code4 = 0  and  code3 <> 0 and code2 = 0


прочие населенные пункты
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR ALTER VIEW LOCALITIES_VIEW(
    NAME,
    SOCR,
    CODE,
    INDEXX,
    CODE1,
    CODE2,
    CODE3,
    CODE4,
    KOD_T_ST)
AS
--населенные пункты
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr
where
--code1 = 60 and
--code2 = 3 and
code3= 0  and   code4 <> 0
;


улицы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR ALTER VIEW STREETS_VIEW(
    NAME,
    SOCR,
    CODE,
    INDEXX,
    CODE1,
    CODE2,
    CODE3,
    CODE4,
    KOD_T_ST)
AS
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr_street
where
 code4 <> 0
;





Связи в выборках такие получились

районы области

Код: plsql
1.
select * from district_view where district_view.code1 = regions_view.code1 




все города области
Код: plsql
1.
select * from sities_view where sities_view.code1 = regions_view.code1 



где sities_view.code2 = 0 - это основные города области. при другом значении code2 - районные города.

населенные пункты области (конкретного района области)

Код: plsql
1.
select * from localities_view where localities_view.code1 = regions_view.code1 and localities_view.code2 = district_view.code2 




ну и улицы.

районных населенных пунктов
Код: plsql
1.
select * from STREETS_VIEW where STREETS_VIEW.code1 = regions_view.code1 and streets_view.code4 = localities_view.code4 



улицы городов

Код: plsql
1.
select * from STREETS_VIEW where STREETS_VIEW.code1 = regions_view.code1 and streets_view.code3 = sities_view.code3 




по поводу выборки улиц населенных пунктов и городов не особо уверен.

Может кто подправит?

Спасибо
...
Рейтинг: 0 / 0
Еще раз про кладр
    #38872892
Michael Demidov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergq , вечер добрый.

Полагаю, что я, как автор «той статейки», могу кое-что подсказать.

В КЛАДРе иерархия составных частей адреса выглядит так:

Регион —› [ Район ] —› [ Город | Населённый пункт ] —› [ Улица ] —› [ Список домов ]

В квадратных скобках — необязательные элементы. Город и населённый пункт — вещи взаимоисключающие, и никогда в одном адресе одновременно не встречаются. Более того, сам смысл слов «город» и «населённый пункт» весьма размыт, иногда два одинаковых соседних небольших городка называются: один — городом, а другой — населённым пунктом.

Видно, что улица может «принадлежать» не только городу или другому населённому пункту, но и району, и даже региону. Типичный пример: Москва и Санкт-Петербург, — они в КЛАДРе считаются регионами, но содержат улицы, минуя все остальные уровни иерархии. Более того, никто не запрещает иметь внутри такого региона ещё и города (пригороды), в которых тоже есть улицы, причём иногда даже с такими же названиями. К сожалению, конкретные примеры сейчас привести не могу (база осталась на работе), но мы это всё проверяли.

(Кстати, для полноты картины: улицы тоже являются необязательными элементами адреса, то есть существуют дома, которые «принадлежат» посёлку или городу, не имея даже улицы в составе адреса.)

Поэтому STREETS_VIEW у вас охватывает только очень малую часть улиц. Честно говоря, я вообще не вижу смысла в условии code4 <> 0, ведь вся таблица kladr_street не содержит ничего, кроме улиц. Если убрать условие, то получится:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR ALTER VIEW STREETS_VIEW(
    NAME,
    SOCR,
    CODE,
    INDEXX,
    CODE1,
    CODE2,
    CODE3,
    CODE4,
    KOD_T_ST)
AS
select NAME,SOCR,CODE,INDEXX,CODE1,CODE2,CODE3,CODE4,KOD_T_ST from kladr_street
;


Правда, тогда непонятно, зачем вообще создавать отдельный view для этого.

Что касается запросов для улиц, то в условии where нужно всегда явно указывать все 4 кода, чтобы не было путаницы, то есть, примерно так:

Код: sql
1.
select * from STREETS_VIEW where STREETS_VIEW.CODE1 = :region_code and STREETS_VIEW.CODE2 = :DISTRICT_CODE and STREETS_VIEW.CODE3 = :CITY_CODE and STREETS_VIEW.CODE4 = :LOCALITY_CODE


и явно передавать нули вместо ненужных элементов.

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


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