powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование справочника адресов клиентов,сотрудников
16 сообщений из 41, страница 2 из 2
Проектирование справочника адресов клиентов,сотрудников
    #36263707
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baracsbuhBotТо, что обработка такой структуры в основном только рекурсией - нас это не волнует (это волнует программистов).
Чтоб я так жил!При ограничении максимального уровня вложенности можно вместо рекурсии использовать несколько left join
Кроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках.

По моему, это проще, удобнее и универсальнее, чем ваша структура.
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263733
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках.

если честно то это хотя и быстрее но требует доп гемороя поддержания актуальности (изменение любого элемента иерархии и синхронизация этих элементов с последующим отслеживанием текущего пложения объекта учета отностильно их при репликациях с внешними источниками) и отслеживания количества уровней иерархии ксткати (был "улица/дом/офис" а стал "улица/дом/корпус/этаж/офис" скажем)
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263824
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Last1CmenавторКроме того, можно для каждого элемента держать полное собранное название - будет проще при типичных выборках.

если честно то это хотя и быстрее но требует доп гемороя поддержания актуальности (изменение любого элемента иерархии и синхронизация этих элементов с последующим отслеживанием текущего пложения объекта учета отностильно их при репликациях с внешними источниками) и отслеживания количества уровней иерархии ксткати (был "улица/дом/офис" а стал "улица/дом/корпус/этаж/офис" скажем)Ну, это уж вам выбирать.

В многих СУБД, например, в MSSQL, это можно сделаеть одним апдэйтом в триггере.

Зато выборки потом будут проще. Представьте, иначе при любых выборках адресов для фирм или сотредников нужно будет всегда делать кучу джойнов или сложный рекурсивный запрос...
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263844
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПредставьте, иначе при любых выборках адресов для фирм или сотредников нужно будет всегда делать кучу джойнов или сложный рекурсивный запрос...

alexeyvg, да знаю знаю потому и озвучил проблему т.к. всё никак не могу полностью отдать предпочтение джойнам и рекурсии или полным путям в конечных элементах (у мну 1це а там струтура иерархий довольно неудобная для прямых запросов к БД) и там и там свой геморой хотя конечно второй вариант на голову шустрее :)
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263864
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Last1Cmenхотя конечно второй вариант на голову шустрее :)При этом этот сложный код получения полного текста адреса нужно будет написать и поддерживать только в одном месте.
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263875
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg, ну если тригером отслеживать только запись конечного элемента (там и апдейтить всё что есть) то наверное да
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36263991
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Last1Cmenalexeyvg, ну если тригером отслеживать только запись конечного элемента (там и апдейтить всё что есть) то наверное даМожно триггером апдэйтить все поддеревья ниже изменённых элементов.
Тут ещё от СУБД и её версии зависит.

Если у вас 1с, знасит mssql

Если mssql версии от 2005, то это один апдэйт, если версия меньше, то нужно сначала в цикле несколькими итерациями собрать поддеревья.
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264020
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторто нужно сначала в цикле несколькими итерациями собрать поддеревья

кстати тоже интересный вопрос... циклом (тогда надо знать количество уровней) или рекурсией (тогда тупим безбожно)... если циклом то надо ведь предварительно узнать количество уровней а это рекурсия

как варинат кроме полного адреса ещё и уровень пописывать (апдейтить) в сам элемент справочника (объект учета) (в той же 1це есть Уровень() но это штатно и небыстро)
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264332
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Last1Cmenкстати тоже интересный вопрос... циклом (тогда надо знать количество уровней) или рекурсией (тогда тупим безбожно)... если циклом то надо ведь предварительно узнать количество уровней а это рекурсияДля цикла не нужно знать количества уровней.

Он сам остановится на максимально нужном уровне

Например.
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264344
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторif @@rowcount = 0 break

мдя... зубрить мне ещё и зубрить

кстати а конструкция

авторwhile 1 = 1 не страшно ?
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264437
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Last1Cmenкстати а конструкция

авторwhile 1 = 1 не страшно ?Всегда так писал - наработанный штамп :-).
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264870
baracs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgПри ограничении максимального уровня вложенности можно
Ниже вы про универсальность говорите...
alexeyvgПо моему, это проще, удобнее и универсальнее, чем ваша структура.
Проще и универсальнее, в данной ситуации, взаимоисключающие понятия.
То есть, рисовать структуру БД конечно проще. А вот, работать с ней...
alexeyvgКроме того, можно для каждого элемента держать полное собранное название
...
В многих СУБД, например, в MSSQL, это можно сделаеть одним апдэйтом в триггере.
Что выполнение триггера в MSSQL - тяжелая операция, изменение из триггера других таблиц (кроме той, с которой он связан) приводит к проблемам с блокировками и, наконец, триггеры весьма затрудняют понимание заложенной в БД бизнес-логики, вас видимо, тоже не волнует.

Попробую пояснить свое разбиение на таблицы.
Улица - основной объект адресации. И этих объектов будет больше всего.
Дома, квартиры и т.д. без крайней необходимости в базу пихать не стоит. Сейчас, даже в кризис, жилые дома и прочие строения появляются и исчезают как грибы. Уследить за этим "хозяйством" (т.е. поддерживать базу в актуальном состоянии) очень сложно.
Наконец, с точки зрения привязки к карте (Чем черт не шутит? Вдруг понадобится?) - это линейный объект с присущими именно ему атрибутами.
Да, конечно, кроме улиц бывают еще кварталы, микрорайоны, населенные пункты вообще без улиц... Но подавляющее большинство населения обитает все-таки на улицах.
Как быть с исключениями, надо решать в контексте поставленной задачи.

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

Наконец регионы . Это - территории, которые входят одна в другую как матрешки. Здесь не обойтись без поддержания иерархии.
Но регионов вместе со всем их "содержимым" (областями, землями, округами, районами, префектурами, сельсоветами и т.д.) на порядки меньше чем улиц и населенных пунктов. Соответственно, и ковыряться в этой иерархии будет, хоть и не на порядки, но легче (может быть, даже не придется искуственно ограничивать кол-во уровней вложенности ;-) ).
Ну, и опять таки, у регионов могут быть свои специфические атрибуты.

Отдельную таблицу стран можно рассматривать как каприз
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36264898
baracs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baracsЗдесь не обойтись без поддержания иерархии.
Осспади! "Поддержания" - дело к вечеру
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36267933
Dindilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
baracs,
авторОтдельную таблицу стран можно рассматривать как каприз
Учитывая что в организации используются только пару стран, Россия, Украина, то смысл от такой таблицы думаю не велик будет =)

Вот только как при запросе получить полный адрес из иерархической структуры.. Сверять до тех пор пока parentid не будет равен 0 ? =)
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36268392
baracs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
CREATE FUNCTION [dbo].[fn_GetCategoryLevel] ( @CategoryId int )
RETURNS tinyint

AS
BEGIN

  DECLARE @ParentCategoryId int, @level tinyint

  SET @level =  1 

  SELECT @ParentCategoryId = ParentCategoryId FROM dbo.Categories WHERE CategoryId = @CategoryId

  WHILE @GenCategoryId IS NOT NULL
   BEGIN

     SET @level = @level +  1 

     SELECT @GenCategoryId = GenCategoryId FROM dbo.Categories WHERE CategoryId = @GenCategoryId

   END

  RETURN @level

END

Сложность в другом: не все объекты, "вытащенные" таким образом из таблицы, могут понадобиться для формирования адреса.
Пример для Москвы.
Адрес: г. Москва, ул. Петровка, д. 38.
Что это - Центральный административный округ и муниципальный район Тверской, указывать не надо. Но, если использовать полную иерархию, они "вылезут".
Я вижу два пути:
1) просто отказаться от хранения информации по территориальному делению Москвы;
2) каким-то образом фильтровать "ненужные", при формировании адреса, территориальные образования.
...
Рейтинг: 0 / 0
Проектирование справочника адресов клиентов,сотрудников
    #36271070
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baracsСложность в другом: не все объекты, "вытащенные" таким образом из таблицы, могут понадобиться для формирования адреса.
Пример для Москвы.
Адрес: г. Москва, ул. Петровка, д. 38.
Что это - Центральный административный округ и муниципальный район Тверской, указывать не надо. Но, если использовать полную иерархию, они "вылезут".Если использовать иерархический справочник адресов, то не вылезут - в нём муниципальных районов не будет.

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


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