|
|
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
baracsbuhBotТо, что обработка такой структуры в основном только рекурсией - нас это не волнует (это волнует программистов). Чтоб я так жил!При ограничении максимального уровня вложенности можно вместо рекурсии использовать несколько left join Кроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках. По моему, это проще, удобнее и универсальнее, чем ваша структура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 11:24 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
авторКроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках. если честно то это хотя и быстрее но требует доп гемороя поддержания актуальности (изменение любого элемента иерархии и синхронизация этих элементов с последующим отслеживанием текущего пложения объекта учета отностильно их при репликациях с внешними источниками) и отслеживания количества уровней иерархии ксткати (был "улица/дом/офис" а стал "улица/дом/корпус/этаж/офис" скажем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 11:30 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
Last1CmenавторКроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках. если честно то это хотя и быстрее но требует доп гемороя поддержания актуальности (изменение любого элемента иерархии и синхронизация этих элементов с последующим отслеживанием текущего пложения объекта учета отностильно их при репликациях с внешними источниками) и отслеживания количества уровней иерархии ксткати (был "улица/дом/офис" а стал "улица/дом/корпус/этаж/офис" скажем)Ну, это уж вам выбирать. В многих СУБД, например, в MSSQL, это можно сделаеть одним апдэйтом в триггере. Зато выборки потом будут проще. Представьте, иначе при любых выборках адресов для фирм или сотредников нужно будет всегда делать кучу джойнов или сложный рекурсивный запрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 11:54 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
авторПредставьте, иначе при любых выборках адресов для фирм или сотредников нужно будет всегда делать кучу джойнов или сложный рекурсивный запрос... alexeyvg, да знаю знаю потому и озвучил проблему т.к. всё никак не могу полностью отдать предпочтение джойнам и рекурсии или полным путям в конечных элементах (у мну 1це а там струтура иерархий довольно неудобная для прямых запросов к БД) и там и там свой геморой хотя конечно второй вариант на голову шустрее :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 12:00 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
Last1Cmenхотя конечно второй вариант на голову шустрее :)При этом этот сложный код получения полного текста адреса нужно будет написать и поддерживать только в одном месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 12:06 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
alexeyvg, ну если тригером отслеживать только запись конечного элемента (там и апдейтить всё что есть) то наверное да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 12:09 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
Last1Cmenalexeyvg, ну если тригером отслеживать только запись конечного элемента (там и апдейтить всё что есть) то наверное даМожно триггером апдэйтить все поддеревья ниже изменённых элементов. Тут ещё от СУБД и её версии зависит. Если у вас 1с, знасит mssql Если mssql версии от 2005, то это один апдэйт, если версия меньше, то нужно сначала в цикле несколькими итерациями собрать поддеревья. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 12:45 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
авторто нужно сначала в цикле несколькими итерациями собрать поддеревья кстати тоже интересный вопрос... циклом (тогда надо знать количество уровней) или рекурсией (тогда тупим безбожно)... если циклом то надо ведь предварительно узнать количество уровней а это рекурсия как варинат кроме полного адреса ещё и уровень пописывать (апдейтить) в сам элемент справочника (объект учета) (в той же 1це есть Уровень() но это штатно и небыстро) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 12:52 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
Last1Cmenкстати тоже интересный вопрос... циклом (тогда надо знать количество уровней) или рекурсией (тогда тупим безбожно)... если циклом то надо ведь предварительно узнать количество уровней а это рекурсияДля цикла не нужно знать количества уровней. Он сам остановится на максимально нужном уровне Например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 14:11 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
авторif @@rowcount = 0 break мдя... зубрить мне ещё и зубрить кстати а конструкция авторwhile 1 = 1 не страшно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 14:15 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
Last1Cmenкстати а конструкция авторwhile 1 = 1 не страшно ?Всегда так писал - наработанный штамп :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 14:39 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
alexeyvgПри ограничении максимального уровня вложенности можно Ниже вы про универсальность говорите... alexeyvgПо моему, это проще, удобнее и универсальнее, чем ваша структура. Проще и универсальнее, в данной ситуации, взаимоисключающие понятия. То есть, рисовать структуру БД конечно проще. А вот, работать с ней... alexeyvgКроме того, можно для каждого элемента держать полное собранное название ... В многих СУБД, например, в MSSQL, это можно сделаеть одним апдэйтом в триггере. Что выполнение триггера в MSSQL - тяжелая операция, изменение из триггера других таблиц (кроме той, с которой он связан) приводит к проблемам с блокировками и, наконец, триггеры весьма затрудняют понимание заложенной в БД бизнес-логики, вас видимо, тоже не волнует. Попробую пояснить свое разбиение на таблицы. Улица - основной объект адресации. И этих объектов будет больше всего. Дома, квартиры и т.д. без крайней необходимости в базу пихать не стоит. Сейчас, даже в кризис, жилые дома и прочие строения появляются и исчезают как грибы. Уследить за этим "хозяйством" (т.е. поддерживать базу в актуальном состоянии) очень сложно. Наконец, с точки зрения привязки к карте (Чем черт не шутит? Вдруг понадобится?) - это линейный объект с присущими именно ему атрибутами. Да, конечно, кроме улиц бывают еще кварталы, микрорайоны, населенные пункты вообще без улиц... Но подавляющее большинство населения обитает все-таки на улицах. Как быть с исключениями, надо решать в контексте поставленной задачи. Населенные пункты я предложил вынести в отдельную таблицу т.к. это тоже отдельный класс объектов со своими атрибутами (важны они или нет в данной систме, не знаю), их тоже относительно много (смейтесь-смейтесь) и, с точки зрения картографа - это либо точечный (чаще), либо площадной объект. Да есть огромные города, имеющие внутреннее территориальное деление и, с административной точки зрения, соответствующие регионам. Куда их удобнее "положить" тоже зависит от конкретной задачи. Наконец регионы . Это - территории, которые входят одна в другую как матрешки. Здесь не обойтись без поддержания иерархии. Но регионов вместе со всем их "содержимым" (областями, землями, округами, районами, префектурами, сельсоветами и т.д.) на порядки меньше чем улиц и населенных пунктов. Соответственно, и ковыряться в этой иерархии будет, хоть и не на порядки, но легче (может быть, даже не придется искуственно ограничивать кол-во уровней вложенности ;-) ). Ну, и опять таки, у регионов могут быть свои специфические атрибуты. Отдельную таблицу стран можно рассматривать как каприз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 16:33 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
baracsЗдесь не обойтись без поддержания иерархии. Осспади! "Поддержания" - дело к вечеру ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2009, 16:38 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
baracs, авторОтдельную таблицу стран можно рассматривать как каприз Учитывая что в организации используются только пару стран, Россия, Украина, то смысл от такой таблицы думаю не велик будет =) Вот только как при запросе получить полный адрес из иерархической структуры.. Сверять до тех пор пока parentid не будет равен 0 ? =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 21:34 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
DindilinВот только как при запросе получить полный адрес из иерархической структуры.. Сверять до тех пор пока parentid не будет равен 0 ? =) Почему бы и нет? Пример функции на T-SQL, вычисляющей уровень товарной категории в классификаторе по коду категории (CategoryId - первичный ключ, ParentCategoryId - ссылка на первичный ключ родительской категории): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Сложность в другом: не все объекты, "вытащенные" таким образом из таблицы, могут понадобиться для формирования адреса. Пример для Москвы. Адрес: г. Москва, ул. Петровка, д. 38. Что это - Центральный административный округ и муниципальный район Тверской, указывать не надо. Но, если использовать полную иерархию, они "вылезут". Я вижу два пути: 1) просто отказаться от хранения информации по территориальному делению Москвы; 2) каким-то образом фильтровать "ненужные", при формировании адреса, территориальные образования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2009, 11:08 |
|
||
|
Проектирование справочника адресов клиентов,сотрудников
|
|||
|---|---|---|---|
|
#18+
baracsСложность в другом: не все объекты, "вытащенные" таким образом из таблицы, могут понадобиться для формирования адреса. Пример для Москвы. Адрес: г. Москва, ул. Петровка, д. 38. Что это - Центральный административный округ и муниципальный район Тверской, указывать не надо. Но, если использовать полную иерархию, они "вылезут".Если использовать иерархический справочник адресов, то не вылезут - в нём муниципальных районов не будет. Это в справочнике административного деления есть округа и районы, а в адресном нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2009, 11:56 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=36263707&tid=1543019]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 434ms |

| 0 / 0 |
