Описание многоуровневой системы ведения адресации
В данной системе предусмотрено неограниченное количество элементов адресации (страны, регионы, города, улицы).
В зависимости от нужд провайдера можно настроить свое собственное дерево адресации. Например: Страна → Район → Город → Дом.
В системе адресации всегда присутствуют два элемента адресации: конечная точка подключения (bild_id - дом) и родительский элемент геолокации (улица, район и проч.).
Элементы геолокации имеют субпараметры, которые позволяют детализировать их сущность. Например, равноправные элементы геолокации такие как: Улица, Переулок, Бульвар или Город, Село, ПГТ.
Элементы системы адресов связаны между собой и не подлежат изменению после создания.
Схема адресов
- Украина (страна)
- Киевская обл (регион)
- Киев (город)
- Хрещатик (улица)
- 32 (дом)
- Хрещатик (улица)
- Киев (город)
- Киевская обл (регион)
Возможности
Пользователь (провайдер) сам задает схему адресов. Структура - линейная. Из обязательных уровней только дом (последний уровень, который соединяет новые адреса с уже существующей таблицей builds.
Для работы используются следующие таблицы (названия приблизительные):
levels - Уровни структуры адресов (например 1-Страна, 2-Город, 3-Улица, 4-Дом ). Для каждого уровня указывается название уровня и имя переменной (для использования в шаблонах)
values - ноды (узлы) адреса. Сохранены в виде дерева. Каждое значение имеет 2 параметра - уровень и родительский элемент (ссылка на элемент более высокого уровня). Для примера значение "улица Бандеры" будет иметь уровень 3 (улица) и ссылку на родительский элемент "город Коломыя":
Code Block | ||
---|---|---|
| ||
DROP TABLE IF EXISTS `address_levels`;
CREATE TABLE `address_levels` (
`level` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level_name` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`level`)
) DEFAULT CHARSET=utf8 COMMENT='Address node types';
INSERT INTO `address_levels` VALUES
(1,'Область'),
(2,'Район'),
(3,'Населенный пункт'),
(4,'Улица'),
(5,'Дом');
DROP TABLE IF EXISTS `address_values`;
CREATE TABLE `address_values` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level_id` int(11) unsigned NOT NULL DEFAULT '0',
`value` varchar(100) NOT NULL DEFAULT '',
`parent_id` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COMMENT='Address nodes';
INSERT INTO `address_values` VALUES
(19,1,'Черновецкая',0),
(20,1,'Тернопольская',0),
(21,1,'Ивано-Франковская',0),
(22,2,'Кицманский',19),
(23,2,'Заставновский',19),
(24,2,'Путыльский',19),
(25,2,'Вижницкий',19),
(26,2,'Новоселицкий',19),
(27,3,'с. Берегомет',22),
(28,3,'с. Мамаивцы',22),
(29,3,'с. Розтокы',24),
(30,3,'смт. Путыла',24),
(31,3,'г. Выжница',25),
(32,3,'смт. Берегомет',25),
(33,3,'с. Зеленый гай',26),
(34,3,'с. Викно',23),
(35,2,'Косовский',21),
(36,3,'с. Куты',35),
(37,3,'с. Розтокы',35),
(38,2,'Гусятинский',20),
(39,2,'Залищиковский',20),
(40,2,'Лановецкий',20),
(41,3,'с. Викно',38),
(42,3,'с. Оленивка',38),
(43,3,'с. Зеленый гай',39),
(44,3,'с. Оленивка',40),
(45,4,'Шевченко',36),
(46,4,'Стуса',36),
(47,5,'8',46),
(48,5,'10',46),
(49,5,'12',46),
(50,4,'Петрова',30),
(51,5,'23',50);
DROP TABLE IF EXISTS `address_main`;
CREATE TABLE `address_main` (
`address_id` int(11) unsigned NOT NULL DEFAULT '0',
`location_id` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`address_id`)
) COMMENT='Address main';
INSERT INTO `address_main` VALUES
(47,1),
(48,2),
(49,3),
(51,4); |
address_levels - Уровни структуры адресов.
address_values - ноды (узлы) адреса.
address_main - связь между деревом адресов и location_id. В таблице сохраняется location_id, id последней ноды адреса. (айди дома, если дом последний уровень).
Шаблон изменения и отображения адреса в веб форме планирую заменить строкой с полным адресом и кнопкой изменения. При нажатии открывается модальное окно с выбором адреса, после закрытия модального окна в форму подставляется location_id выбранного адреса.
Для отображения в документах и шаблонах данные можно получить с помощью user→info() , имя ключей хеша берется из таблицы уровней.
Отличия
В отличии от старой структуры (когда для каждого уровня создается своя таблица), для древовидных адресов недоступны следующие функции:
Нельзя сделать JOIN к другим таблицам (юзерс, интернет и тд)
Нельзя использовать в резулт_формере
Нельзя подключить к users_list
Нельзя подключить к internet_list
Нельзя вывести в виде таблицы
Нет доступа к всему массиву адресов, только по одному.