powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильная Организация таблиц в БД
25 сообщений из 42, страница 1 из 2
Правильная Организация таблиц в БД
    #36919628
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите, пожалуйста, как правильно организовать таблицы?

На данный момент у меня 15 таблиц в каждой из которых есть свои адресные поля (10 полей: регион,район,город, населённый пункт, улица,....)

tab1
---------
region
rayon
gorod
np
ulica
...

tab2
---------
region
rayon
gorod
np
ulica
...

****

tab15
---------
region
rayon
gorod
np
ulica
...


Я хочу сделать одну таблицу с индентификатором вида адреса(для каждой из 15 таблиц) и с индентификатором поля адреса (для каждого из 10 наименований),

tab
--------
type
vid_adres
value


таким образом в место 15 строк (если считать во всех таблицах), у меня получиться 150 строк в одной новой таблице, насколько это оправдано?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919650
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t насколько это оправдано?
Зависит от количества записей.
Для малого значения нет смысла заморачиваться с нормализованными таблицами.
Можно все забить в плоскую таблицу.
Неправильно с точки зрения реляционных бах, но гораздо проще в использовании.
При большом количестве данных преимущества реляционного представления данных уже видны невооруженным взглядом.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919674
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня около 100 новых записей в день.

получается в 15 таблицах = 1500.

а если сделаю одну таблицу то 15000 строк в день.

Нужно оставить 15 таблиц или сделать одну?
Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у меня запросы не будут тормозить?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919710
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t,

Возьмите готовый КЛАДР и немучьте ни себя ни нас.

Все украдено до нас. (с) ...
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919721
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня есть кладр, но бывают случаи когда - хочешь - не хочешь приходиться адрес в ручную вбивать - ибо кладр не совершенен и некоторых адресов там нет.
вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр - или лучше оставить дополнительные адресные поля в каждой из таблиц?

Я реально запуталась...
Как лучше, то?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919765
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_tу меня есть кладр, но бывают случаи когда - хочешь - не хочешь приходиться адрес в ручную вбивать - ибо кладр не совершенен и некоторых адресов там нет.
вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр - или лучше оставить дополнительные адресные поля в каждой из таблиц?

Я реально запуталась...
Как лучше, то?
Лучше неменять структуру, т.к. при обновлении будут проблемы. Те данные которые отсутствуют - добивайте согласно структуре КЛАДР. Обновление в основном делается методом дополнения а не полной замены (делается но крайне редко), но сделать бекап перед обновлением возьмите за правило. Даже если что-то случайно и набокопорите то можно откатиться на бекап или потом сравнить с бекапом и дотянуть что-то.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919767
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_tу меня около 100 новых записей в день.

получается в 15 таблицах = 1500.

а если сделаю одну таблицу то 15000 строк в день.

Нужно оставить 15 таблиц или сделать одну?
Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у меня запросы не будут тормозить?

Не понимаю этой логики - разнесем записи по 15 таблицам, и будет везде по чуть-чуть.

Но искать-то нужно по всем?

Стало быть, в запросах будет UNION из 15 секций, и каждый запрос все равно будет молотить все 15,000*дней строк? (только труднее ему будет - общего индекса-то нет)

Если уж говорить о проблемах производительности больших таблиц, то есть кластеризация.

А если искать нужно не по всем, то есть эти таблицы функционально разные, то расскажите об этом подробнее.


zvezda_tкладр не совершенен и некоторых адресов там нет.
вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр

Если нужно различать данные, взятые из КЛАДР и введенные вручную, сделайте дополнительное поле "введено вручную". Имеет смысл, если будете с КЛАДРом периодически синхронизироваться. Но разбиваться на разные таблицы это не повод.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919785
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cane Cat Fisher
Если нужно различать данные, взятые из КЛАДР и введенные вручную, сделайте дополнительное поле "введено вручную". Имеет смысл, если будете с КЛАДРом периодически синхронизироваться. Но разбиваться на разные таблицы это не повод.

авторТе данные которые отсутствуют - добивайте согласно структуре КЛАДР.
Что то я не поняла...
Данные введенные с использованием кладр - это же просто код. Он у меня так и храниться - одно поле с названием - code_kladr.
Как это я вручную код создам? - мне что справочник кладр самой недостающими данными пополнять?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919824
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cane Cat Fisher

Не понимаю этой логики - разнесем записи по 15 таблицам, и будет везде по чуть-чуть.

Но искать-то нужно по всем?

Стало быть, в запросах будет UNION из 15 секций, и каждый запрос все равно будет молотить все 15,000*дней строк? (только труднее ему будет - общего индекса-то нет)

Если уж говорить о проблемах производительности больших таблиц, то есть кластеризация.

А если искать нужно не по всем, то есть эти таблицы функционально разные, то расскажите об этом подробнее.


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

Вот у меня первая таблица -
user
----
type (студент, отец, мать)
cod_kladr_p(адрес прописки)
mail(почтовый индекс)
hous(дом)
guarter(квартира)
region_p (на случай если нет адреса кладр)
rayon_p (на случай если нет адреса кладр)
gorod_p (на случай если нет адреса кладр)
ulica_p (на случай если нет адреса кладр)

cod_kladr_f(адрес фактический)
mail_f(почтовый индекс)
hous_f(дом)
guarter_f(квартира)
region_f (на случай если нет адреса кладр)
rayon_f (на случай если нет адреса кладр)
gorod_f (на случай если нет адреса кладр)
ulica_f (на случай если нет адреса кладр)


job

------
type (отец, мать)
cod_kladr_y(адрес рабочий/юридический)
mail_y(почтовый индекс)
hous_y(дом)
guarter_y(квартира)
region_y (на случай если нет адреса кладр)
rayon_y (на случай если нет адреса кладр)
gorod_y (на случай если нет адреса кладр)
ulica_y (на случай если нет адреса кладр)

cod_kladr_ff(адрес рабочий/фактический)
mail_ff(почтовый индекс)
hous_ff(дом)
guarter_ff(квартира)
region_ff (на случай если нет адреса кладр)
rayon_ff (на случай если нет адреса кладр)
gorod_ff (на случай если нет адреса кладр)
ulica_ff (на случай если нет адреса кладр)


и еще таких много таблиц
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919830
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t... - мне что справочник кладр самой недостающими данными пополнять?
Нет. Прилетят зеленые человечки и все за тебя сделают. Бу-га-га.
Ветка плавно перетекает во флуд. Поэтому небуду больше в ней постить. Все что нужно сделать уже сказано. Дальше все зависит от автора.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36919948
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.10.2010 11:14, zvezda_t wrote:

> Нужно оставить 15 таблиц или сделать одну?

Лучше сделать одну. Если у них одинаковая структура и одни и те же данные хранятся.

> Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у
> меня запросы не будут тормозить?

Не будут. Но это -- очень общий ответ на этот вопрос.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36920047
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cane Cat Fisher , я привела свою структуру таблиц...
Вы подскажите мне - правильная ли она????
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36921841
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто - нибудь, кто работал с Кладр, подскажите как правильно данные хранить...
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924096
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была подобная задача, вот вариант решения.

Можно организовать собственное хранилище адресов, отсутствующих в КЛАДР. Исходные посылки:
адрес состоит из отдельных блоков (страна, автономный округ, штат, область, район, улица, микрорайон и т.д.)

у разных адресов набор блоков разный - нельзя все адреса уложить в жесткую структуру из N полей (РФ/Ивановская обл./г.Чуйск/с.Зуево/ул.Центральная/д.80 и РФ/Ханты-Мансийский АО/стойбище Дрыщ-Мурзяк/7-я юрта)

географические объекты представляют собой узлы дерева: у каждого есть родитель и потомки (родитель г.Чуйска - Ивановская обл., потомки - г.Иваново, с.Зуево, пгт.Жихарево и т.д.)

Исходя из этого имеем две сущности - Тип адреса: страна, улица, город, село; и Блок адреса: Украина (страна), РФ (страна), Хмельницкая (обл.), Ивановская (обл.), Ханты-Мансийский (АО) и т.д.

Используется диалект Firebird

Тип адреса - ADRESS_TYPE
ПолеТип данныхОписаниеIDBIGINTуникальный номер записиPREFIXSMALLINTзначение м.б. равно 0 или 1. Описание см. в примере нижеNAMEVARCHAR(64)наименование типаDESCRIPTIONVARCHAR(256)описание типа
Блоки адресов - ADRESS_BLOCK, каждая запись в таблице ссылается на родительскую из этой же таблицы
ПолеТип данныхОписаниеIDBIGINTуникальный номер записиTYPE_IDBIGINTID типа адреса из таблицы ADRESS_TYPEPARENT_IDBIGINTID родительского блока адреса из этой же таблицыNAMEVARCHAR(64)наименование (собственно, адрес)
Вот пример данных
ADRESS_TYPE
IDPREFIXNAMEDESCRIPTION11страна20обл.область31АРавтономная республика41г.город50р-нрайон61ул.улица


ADRESS_BLOCK
IDTYPE_IDPARENT_IDNAME11nullУкраина231Крым321Хмельницкая442Симферополь543Шепетовка665Козацкая
Т.е. в таблице блоков есть улица Козацкая (6), которая в городе Шепетовка (5), который в Хмельницкой (3) области на Украине (1)
Там же город Симферополь (4), который в автономной республике Крым (2), которая на Украине (1)

Кстати, мы пишем "ул. Козацкая" (тип "улица" перед блоком "Козацкая"), но "Зареченский район" (тип "район" после блока "Зареченский"). Вот для этого и нужно поле ADRESS_TYPE.PREFIX
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924553
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JohnSparrow , большое спасибо! Очень понятно всё объяснили)))
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924558
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня возник такой вопрос:

Как организовать сам справочник ясно, а как правильно хранить выбранные пользователем адреса(домашний, рабочий, место учёбы,...)?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924714
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t,

место учёбы - это не адрес, вобщем-то, это организация. Я, к примеру, на вопрос "где ты учился" отвечаю "заборостроительный техникум", а не "3я улица строителей, дом 8", уверен, подавляющее большинство людей на земле отвечают подобным образом :))
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924797
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ok

как правильно хранить выбранные пользователем адреса(домашний, рабочий)?
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36924852
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow , Вы уж сразу подскажите Звездочке, как будет выглядеть SQL-запрос "Вывести всех клиентов, живущих на заданной улице".

zvezda_t, такие древовидные хранилища адресов обсуждали, например, тут , почитайте. В двух словах - требуются хитрые проверки на допустимость адреса, как электронные, так и организационные, так как операторы имеют шанс набить кучу мусора, вроде "Москва, кв.1". И если уж заводите свое хранилище адресов, заранее позаботьтесь о формальной, организационной процедуре его наполнения и поддержания в актуальном состоянии.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36925720
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t
У меня есть анкета студента, в ней необходимо указать адрес место жительства, адрес прописки, адреса места жительства и прописки для его родителей, а также адреса места работы родителей.

Код: 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.
/*Карточка*/
TAB_CARD:
id
utype /*родитель/студент*/
usex  /*женский/мужской*/

/*Родители */
TAB_PARENT
id
card_id            /* Ребенок */
parent_card_id  /* Родитель */

/*Место работы*/
TAB_JOB
id
tab_card_id      /*ссылка на карточку*/

/*адреса (для всех)*/
TAB_ADDRESS
id
tab_card_id    
tab_job_id
cod_kladr_f
mail_f
hous_f
guarter_f
region_f
rayon_f
gorod_f
ulica_f
В таблице "адреса" хранятся адреся для двух сущностей CARD и JOB.
В зависимости от того, чей это адрес (карточки или человека), заполняется либо tab_card_id, либо tab_job_id.

Ну это одно из решений, а так по всяковски можно делать.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36925737
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t,

Да еще забыл - нужно ввести таблицу "типы адресов" (фактический, юридический, прописки,...).
Как связать ее с таблицей "адреса", я думаю понятно.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36926426
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherJohnSparrow , Вы уж сразу подскажите Звездочке, как будет выглядеть SQL-запрос "Вывести всех клиентов, живущих на заданной улице".

zvezda_t, такие древовидные хранилища адресов обсуждали, например, тут , почитайте. В двух словах - требуются хитрые проверки на допустимость адреса, как электронные, так и организационные, так как операторы имеют шанс набить кучу мусора, вроде "Москва, кв.1". И если уж заводите свое хранилище адресов, заранее позаботьтесь о формальной, организационной процедуре его наполнения и поддержания в актуальном состоянии.
ИМХО, в общем случае проблема как для обычных справочников, так и для иерархических успешно решается разделением обязанностей между сотрудниками: карточки конечных пользователей регистрирует один, а данные в справочниках (перечни адресов, профессий и т.д.) - второй.

Насчет блоков типа "дом", "квартира". ИМХО, в качестве конечного типа адреса можно взять "микрорайон", "улица" и т.д., а вот отдельные дома (и прочее подобное) уже не регистрировать. А в таблице, например, клиентов, иметь поля ADRESS_ID (ID улицы или микрорайона или блока адреса другого типа), и ADRESS_ADDITIONAL (уточняющее адрес строковое поле с записями вида "д.8", "д.19/2 кв.46", "офис 12"). Например, даже для доставки товаров заказчикам проще сделать их выборку по улицам, а не по каждому дому.

А вот пример "Россия, г.Москва, кв.12" действительно мутный. Варианты для его контроля можно предложить следующие:
1) Создать таблицу ADRESS_TYPE_RELATION с полями PARENT_ID и CHILD_ID - ID родительского типа адреса (из ADRESS_TYPE) и дочернего (оттуда же). Т.е. если ID типа "город" равен 100, то дочерними к городу Москва можно зарегистрировать только такие блоки адресов, типы которых встречаются в этой таблице как CHILD_ID для PARENT_ID = 100:
ADRESS_TYPE
IDNAMEDESCRIPTION100г.город115ул.улица125кв.квартира
ADRESS_TYPE_RELATION
PARENT_IDCHILD_ID100115115125
Т.е. блок типа "улица" (115) можно сделать дочерним по отношению к блоку типа город (100). Блок типа "квартира" (125) можно сделать дочерним по отношению к блоку типа "улица" (115). Но вот для блока "Москва" типа "город" (100) нельзя сделать дочерним блок "81" типа "квартира" (125), т.к. связь между ними не зарегистрирована.

2) В таблицу ADRESS_TYPE добавить поле LEVEL целочисленного типа. И ввести бизнес правило: тип дочернего блока адреса должен быть на 1 меньше, чем тип родительского. Например:
ADRESS_TYPE
IDNAMEDESCRIPTIONLEVEL90обл.область491губ.губерния4100г.город5115ул.улица6
Блок типа "город" может быть дочерним для блоков "область" и "губерния", блок типа "улица" - дочерним по отношению к "городу", но не к "губернии".

Схема №2 выглядит проще первой, но явно хуже, т.к. слишком жесткая. Например, на Украине есть город Севастополь, он подчиняется напрямую Киеву, а не автономной республике Крым. А еще есть города областного подчинения (минуя уровень района) и т.д.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36926960
zvezda_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAYAKOV_SV ,спасибо большое за пример!!! именно это меня и волновало, теперь понятно- что так делать можно))) Спасибо за разъяснения!


JohnSparrow , я поняла логику организации ваших таблиц :) , благодарю!!!
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36927468
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow,

Вторая схема, действительно, не подходит. Ведь первой же проблемой, с которой сталкивается хранилище адреса, будет населенный пункт без улиц - деревня Собакино, д.1. Жесткая иерахия тут не катит.

А к первой схеме сразу вопрос: хорошо, мы определили, что "Москва, д.1" не пропускать - необходима улица. Но ведь для деревни Собакино, дом 1 без улицы допустим! Значит, таблица ограничений должна привязываться не просто к типам объектов, а к их конкретным экземплярам - для Москвы одно, для Собакино другое. Может быть, настроить в таблице ограничений предопределенные шаблоны допустимости адресов - допустимую иерархию классов, а для каждого населенного пункта указывать ссылку на шаблон.

Ну и осмелюсь повторить свой первый вопрос - "Вывести всех клиентов, живущих в заданном объекте иерархии" (поскольку с улиц-домов Вы спрыгнули :), например, в Приморском крае, если клиенты привязаны к подчиненным узлам иерархии произвольной вложенности. Только чур, оставим на время оракловский CONNECT BY - хотим, чтобы работало на любой СУБД.
...
Рейтинг: 0 / 0
Правильная Организация таблиц в БД
    #36928632
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvezda_t
JohnSparrow , я поняла логику организации ваших таблиц :) , благодарю!!!
Всегда пожалуйста, уважаемая zvezda_t , :)

Cane Cat FisherJohnSparrow,
А к первой схеме сразу вопрос: хорошо, мы определили, что "Москва, д.1" не пропускать - необходима улица. Но ведь для деревни Собакино, дом 1 без улицы допустим! Значит, таблица ограничений должна привязываться не просто к типам объектов, а к их конкретным экземплярам - для Москвы одно, для Собакино другое. Может быть, настроить в таблице ограничений предопределенные шаблоны допустимости адресов - допустимую иерархию классов, а для каждого населенного пункта указывать ссылку на шаблон.

Cane Cat Fisher , во-первых, спасибо за ссылку на подобную тему. Прочитал. Как я понял, там Вы подняли тот же вопрос: "г.Москва, кв.10" - как избежать; и Вам ответили, что оператор может ввести это, а избегать следует организационными методами. Надеюсь, я понял правильно и, если так, сам присоединяюсь к мнению Ваших собеседников.

Далее небольшое рассуждение на тему (все - ИМХО, естественно). В общем случае база данных должна максимально полно отражать реалии предметной области (например, не заводить виртуальных улиц, если реально их нет). Но для отражения этих реалий сама предметная область должна быть неплохо структурирована, каждый тип сущностей должен иметь набор признаков, однозначно отделяющих его от другого типа. Например (обсудим населенные пункты, оставив пока в покое области, округа и т.п.):
тип "Город" - сущность, которая состоит из улиц и/или микрорайонов

тип "Село" - сущность, которая состоит из улиц и/или домов

тип "Деревня" - сущность, которая состоит из домов
и в реальном мире всем существующим населенным пунктам нужно сменить тип. Например, село Иваново из двух домов станет деревней. И т.д. К сожалению, реализация этого дела произойдет только после наступления Эры Роботов, :).

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

Другой вариант. Мы создаем таблицу типов (ADRESS_TYPE) и таблицу связей (ADRESS_TYPE_RELATION) - какие типы могут быть дочерними для данного типа. А типы у нас такие (применительно к нас. пунктам):

город

город, в котором может быть не указана улица

село

село, в котором может быть не указана улица

...

Дополнительно создаем таблицу ADRESS_NAME - общеупотребительные названия типов населенных пунктов (город, село, деревня, хутор, поселок и т.д.). Теперь для каждого блока адреса мы будем хранить [ID названия] и [ID типа]. Например (название, имя, тип):

город Москва (город)

город Верхнефуцынск (город, в котором может быть не указана улица)

деревня Кнуровка (село, в котором может быть не указана улица)

деревня Дунаевка (село)

При отображении оператору/пользователю используется связка ADRESS_NAME - ADRESS_BLOCK: "город Москва". Но при регистрации адреса система проверяет тип адреса. Т.е. адрес "Москва, дом 10" она отвергнет, а "Верхнефуцынск, дом 12" примет.

Таким образом, мы сформировали предметную область с четкими сущностями, а сущности реальной предметной области трансформировали в названия ("город" в "город Москва" при выводе на экран), которые вообще ни на что не влияют. Остается проблема - и здесь для каждого нового адреса требуется выяснить его тип - т.е., по сути, собрать досье на отдельные населенные пункты, районы и другие адм.-терр. образования. Вариант решения может быть следующий:

мы ассоциируем типы адресов между собой (например, записи ADREE_TYPE "город с улицами" и "город без улиц" относятся к ADRESS_NAME "город")

для каждого ADRESS_NAME мы храним ссылку на наиболее строгий из его ADRESS_TYPE (для "города" тип "с улицами" строже, чем тип "без улиц")

при регистрации нового адреса система оценивает его допустимость для данного типа и, если он недопустим, начинаются организационные процедуры. Если по итогам расследования оказалось, что в городе Москва (тип "город") есть адрес "Москва. дом.12", то мы изменяем тип Москвы на "город с улицами и отдельными домами" и успешно регистрируем "некорректный" адрес.

Вывод: получится тот же классификатор, но к "Москве" привязывается не отдельный набор допустимых иерархий, а ссылка на шаблон ("тип" в терминах предыдущих абзацев).

Cane Cat Fisher
Ну и осмелюсь повторить свой первый вопрос - "Вывести всех клиентов, живущих в заданном объекте иерархии" (поскольку с улиц-домов Вы спрыгнули :), например, в Приморском крае, если клиенты привязаны к подчиненным узлам иерархии произвольной вложенности. Только чур, оставим на время оракловский CONNECT BY - хотим, чтобы работало на любой СУБД.
Судя по всему, для забивания гвоздей все же стоит использовать молоток, а не абстрактный инструмент из дерева и металла. Если в базе предполагаются иерархические хранилища (таблицы, группы таблиц), то имеет смысл выбирать СУБД, которая поддерживает иерархические запросы. Я писал про Firebird, ее SQL реализует конструкцию WITH RECURSIVE n(...) AS (...) SELECT...

Ну а если рассматривать абстрактные сферические СУБД в вакууме, то давайте остановимся хотя бы на реляционных (я с другими вообще не знаком, так что остановка обязательная, :( ). Раз сервер не умеет, такой запрос может сделать клиент. Допустим, соответствующий метод клиентского класса принимает ID родительского элемента (некоторого района Ростовской области) ID_родителя, а далее он

запросом получает список всех ID, где PARENT_ID = ID_родителя

преобразует список в строку вида "12, 324, 415, 657, 1089" - это strChildAdresses

получает всех детей, чьи родители перечислены в strChildAdresses - "SELECT ID FROM ADRESS_BLOCK WHERE PARENT_ID IN (" + strChildAdresses + ")"

сохраняет результат в новую строку и т.д.

В итоге получим массив строк, в каждой из которых список DI через запятую. Нулевой элемент массива - список детей исходного ID_родителя, первый - список детей, чьи родители перечислены в нулевом и т.д. Потом мы пишем высокотехнологичный запрос вида "SELECT * FROM CLIENTS WHERE ADRESS_ID IN (ХХХ)", где "ХХХ" - конкатенация всех строк с перечнями дочерних ID из массива. Оно, конечно, получится несколько запросов к базе со стороны клиента, но ведь почему-то выбрана неподходящая для данной задачи СУБД, так что...

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


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