|
|
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Подскажите, пожалуйста, как правильно организовать таблицы? На данный момент у меня 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 строк в одной новой таблице, насколько это оправдано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:59 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_t насколько это оправдано? Зависит от количества записей. Для малого значения нет смысла заморачиваться с нормализованными таблицами. Можно все забить в плоскую таблицу. Неправильно с точки зрения реляционных бах, но гораздо проще в использовании. При большом количестве данных преимущества реляционного представления данных уже видны невооруженным взглядом. Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:06 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
у меня около 100 новых записей в день. получается в 15 таблицах = 1500. а если сделаю одну таблицу то 15000 строк в день. Нужно оставить 15 таблиц или сделать одну? Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у меня запросы не будут тормозить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:14 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_t, Возьмите готовый КЛАДР и немучьте ни себя ни нас. Все украдено до нас. (с) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:23 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
у меня есть кладр, но бывают случаи когда - хочешь - не хочешь приходиться адрес в ручную вбивать - ибо кладр не совершенен и некоторых адресов там нет. вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр - или лучше оставить дополнительные адресные поля в каждой из таблиц? Я реально запуталась... Как лучше, то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:28 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_tу меня есть кладр, но бывают случаи когда - хочешь - не хочешь приходиться адрес в ручную вбивать - ибо кладр не совершенен и некоторых адресов там нет. вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр - или лучше оставить дополнительные адресные поля в каждой из таблиц? Я реально запуталась... Как лучше, то? Лучше неменять структуру, т.к. при обновлении будут проблемы. Те данные которые отсутствуют - добивайте согласно структуре КЛАДР. Обновление в основном делается методом дополнения а не полной замены (делается но крайне редко), но сделать бекап перед обновлением возьмите за правило. Даже если что-то случайно и набокопорите то можно откатиться на бекап или потом сравнить с бекапом и дотянуть что-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:44 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_tу меня около 100 новых записей в день. получается в 15 таблицах = 1500. а если сделаю одну таблицу то 15000 строк в день. Нужно оставить 15 таблиц или сделать одну? Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у меня запросы не будут тормозить? Не понимаю этой логики - разнесем записи по 15 таблицам, и будет везде по чуть-чуть. Но искать-то нужно по всем? Стало быть, в запросах будет UNION из 15 секций, и каждый запрос все равно будет молотить все 15,000*дней строк? (только труднее ему будет - общего индекса-то нет) Если уж говорить о проблемах производительности больших таблиц, то есть кластеризация. А если искать нужно не по всем, то есть эти таблицы функционально разные, то расскажите об этом подробнее. zvezda_tкладр не совершенен и некоторых адресов там нет. вот поэтому я решила сделать отдельную таблицу для тех адресов которые не нашлись по кладр Если нужно различать данные, взятые из КЛАДР и введенные вручную, сделайте дополнительное поле "введено вручную". Имеет смысл, если будете с КЛАДРом периодически синхронизироваться. Но разбиваться на разные таблицы это не повод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:44 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher Если нужно различать данные, взятые из КЛАДР и введенные вручную, сделайте дополнительное поле "введено вручную". Имеет смысл, если будете с КЛАДРом периодически синхронизироваться. Но разбиваться на разные таблицы это не повод. авторТе данные которые отсутствуют - добивайте согласно структуре КЛАДР. Что то я не поняла... Данные введенные с использованием кладр - это же просто код. Он у меня так и храниться - одно поле с названием - code_kladr. Как это я вручную код создам? - мне что справочник кладр самой недостающими данными пополнять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:50 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
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 (на случай если нет адреса кладр) и еще таких много таблиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:03 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_t... - мне что справочник кладр самой недостающими данными пополнять? Нет. Прилетят зеленые человечки и все за тебя сделают. Бу-га-га. Ветка плавно перетекает во флуд. Поэтому небуду больше в ней постить. Все что нужно сделать уже сказано. Дальше все зависит от автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:04 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
On 26.10.2010 11:14, zvezda_t wrote: > Нужно оставить 15 таблиц или сделать одну? Лучше сделать одну. Если у них одинаковая структура и одни и те же данные хранятся. > Скажите, пожалуйста, если я сделаю одну таблицу с большим количеством строк - у > меня запросы не будут тормозить? Не будут. Но это -- очень общий ответ на этот вопрос. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:47 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher , я привела свою структуру таблиц... Вы подскажите мне - правильная ли она???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 12:15 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
Кто - нибудь, кто работал с Кладр, подскажите как правильно данные хранить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 07:20 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
Была подобная задача, вот вариант решения. Можно организовать собственное хранилище адресов, отсутствующих в КЛАДР. Исходные посылки: адрес состоит из отдельных блоков (страна, автономный округ, штат, область, район, улица, микрорайон и т.д.) у разных адресов набор блоков разный - нельзя все адреса уложить в жесткую структуру из 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 20:35 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
JohnSparrow , большое спасибо! Очень понятно всё объяснили))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 07:16 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
У меня возник такой вопрос: Как организовать сам справочник ясно, а как правильно хранить выбранные пользователем адреса(домашний, рабочий, место учёбы,...)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 07:20 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_t, место учёбы - это не адрес, вобщем-то, это организация. Я, к примеру, на вопрос "где ты учился" отвечаю "заборостроительный техникум", а не "3я улица строителей, дом 8", уверен, подавляющее большинство людей на земле отвечают подобным образом :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 09:41 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
ok как правильно хранить выбранные пользователем адреса(домашний, рабочий)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 10:17 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
JohnSparrow , Вы уж сразу подскажите Звездочке, как будет выглядеть SQL-запрос "Вывести всех клиентов, живущих на заданной улице". zvezda_t, такие древовидные хранилища адресов обсуждали, например, тут , почитайте. В двух словах - требуются хитрые проверки на допустимость адреса, как электронные, так и организационные, так как операторы имеют шанс набить кучу мусора, вроде "Москва, кв.1". И если уж заводите свое хранилище адресов, заранее позаботьтесь о формальной, организационной процедуре его наполнения и поддержания в актуальном состоянии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 10:41 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
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, либо tab_job_id. Ну это одно из решений, а так по всяковски можно делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 14:52 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
zvezda_t, Да еще забыл - нужно ввести таблицу "типы адресов" (фактический, юридический, прописки,...). Как связать ее с таблицей "адреса", я думаю понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 14:56 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
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 выглядит проще первой, но явно хуже, т.к. слишком жесткая. Например, на Украине есть город Севастополь, он подчиняется напрямую Киеву, а не автономной республике Крым. А еще есть города областного подчинения (минуя уровень района) и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 18:33 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
MAYAKOV_SV ,спасибо большое за пример!!! именно это меня и волновало, теперь понятно- что так делать можно))) Спасибо за разъяснения! JohnSparrow , я поняла логику организации ваших таблиц :) , благодарю!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2010, 07:23 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
JohnSparrow, Вторая схема, действительно, не подходит. Ведь первой же проблемой, с которой сталкивается хранилище адреса, будет населенный пункт без улиц - деревня Собакино, д.1. Жесткая иерахия тут не катит. А к первой схеме сразу вопрос: хорошо, мы определили, что "Москва, д.1" не пропускать - необходима улица. Но ведь для деревни Собакино, дом 1 без улицы допустим! Значит, таблица ограничений должна привязываться не просто к типам объектов, а к их конкретным экземплярам - для Москвы одно, для Собакино другое. Может быть, настроить в таблице ограничений предопределенные шаблоны допустимости адресов - допустимую иерархию классов, а для каждого населенного пункта указывать ссылку на шаблон. Ну и осмелюсь повторить свой первый вопрос - "Вывести всех клиентов, живущих в заданном объекте иерархии" (поскольку с улиц-домов Вы спрыгнули :), например, в Приморском крае, если клиенты привязаны к подчиненным узлам иерархии произвольной вложенности. Только чур, оставим на время оракловский CONNECT BY - хотим, чтобы работало на любой СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2010, 12:04 |
|
||
|
Правильная Организация таблиц в БД
|
|||
|---|---|---|---|
|
#18+
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 из массива. Оно, конечно, получится несколько запросов к базе со стороны клиента, но ведь почему-то выбрана неподходящая для данной задачи СУБД, так что... Второй вариант: на стороне клиента иметь глобальный объект - "дерево адресов", загружать его при инициализации клиентского приложения и реализовать тем или иным способом политику его синхронизации с БД. Очевидно, здесь много возни и простора для косяков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2010, 19:45 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36919721&tid=1542389]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
422ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
86ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 763ms |

| 0 / 0 |
