Как сделать БД городов и снизить нагрузку?

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.527
Реакции
121
Есть города, страны. Кэш грузит на 14 Мб.
Нужно делать, например:
Выводить всю строку родителей: страна, область, город. Например, в speebdar, title, адресе
Вывести зависимое меню из тех же страна, область, город
Вывести блок с выбором городов для выбора города (фильтрация товаров на сайте). На нем список городов с разбивкой на области, страны. Пример: любой крупный интернет-магазин, авито и т.п.
Сейчас все города в одной таблице через parentid. Сохраняю все в кэш в виде массива. Но он весит много.
Как решаются такие задачи, кто знает?
 
Есть города, страны. Кэш грузит на 14 Мб.
Нужно делать, например:
Выводить всю строку родителей: страна, область, город. Например, в speebdar, title, адресе
Вывести зависимое меню из тех же страна, область, город
Вывести блок с выбором городов для выбора города (фильтрация товаров на сайте). На нем список городов с разбивкой на области, страны. Пример: любой крупный интернет-магазин, авито и т.п.
Сейчас все города в одной таблице через parentid. Сохраняю все в кэш в виде массива. Но он весит много.
Как решаются такие задачи, кто знает?
Разбей на несколько таблиц. Город, область итд.
+ подгружать по ajax по необходимости. это самый простой вариант и нагрузка 0.
 
Разбей на несколько таблиц. Город, область итд.
+ подгружать по ajax по необходимости. это самый простой вариант и нагрузка 0.
и как я буду подгружать speedbar?, meta-description, адрес. ajax только для зависимых списков используют же.
И как выводить список фильтрации контента (выбор города)? Т.е. рекурсия всех городов по странам, областям и городам.
 
и как я буду подгружать speedbar?, meta-description, адрес. ajax только для зависимых списков используют же.
И как выводить список фильтрации контента (выбор города)? Т.е. рекурсия всех городов по странам, областям и городам.
Подгружайте только то что нужно в текущий момент
 
Вы только одну сторону рассматриваете - ajax списки
1. для поисковиков тоже нужны ссылки.
2. например, нужновывести TITLE страна/область/город. Как это вывести? Это получается, нужно сначала вывести название города, получить его parenid, далее запрос на область, получить ее parentid, а затем запрос на страну, получить ее название и прочие данные. А это 3 запроса. Это я не про ajax, а php - формирование страницы.
Далее. Мне нужно вывести страницу со списком городов. Города есть одинаковые. Поэтому к ним нужно вывести области. Делаю запрос на все города. Далее, делаю для каждого города запрос, чтобы вывести область. Далее еще запрос, чтобы вывести страну, чтобы сгруппировать по странам.
Так получается?
 
Попробуйте Nested Set Tree применить к вашей задаче. Есть уже готовые классы для работы с деревом, если писать некогда. Зато вы можете одним селектом вытащить сразу всю последовательность Страна/Область/Город/Район/Улица/ итд...
 
Попробуйте Nested Set Tree применить к вашей задаче. Есть уже готовые классы для работы с деревом, если писать некогда. Зато вы можете одним селектом вытащить сразу всю последовательность Страна/Область/Город/Район/Улица/ итд...
Это то, что нужно. Только ничего не понял, никогда не сталкивался.
Можете помочь?
У меня таблица:
Код:
CREATE TABLE IF NOT EXISTS `areas` (
  `areaid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `areaname` varchar(50) NOT NULL DEFAULT '',
  `parentid` int(10) unsigned NOT NULL DEFAULT '0',
  `arrparentid` varchar(255) NOT NULL DEFAULT '',
  `child` tinyint(1) NOT NULL DEFAULT '0',
  `arrchildid` text NOT NULL,
  `listorder` smallint(4) unsigned NOT NULL DEFAULT '0',
  `un_name` varchar(255) NOT NULL,
  `act` enum('1','0') NOT NULL DEFAULT '0' COMMENT 'Видимость для использования',
  `dispsite` enum('0','1') NOT NULL DEFAULT '0' COMMENT 'Вывод в списке возможных городов (урезанная версия)',
  PRIMARY KEY (`areaid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Локации' AUTO_INCREMENT=18752 ;

Пример данных:
Код:
(219, 'Московская область', 0, '0', 1, '219,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466', 219, 'moskovskaya-oblast', '1', '1'),

Я ищу город, вводя часть названия в поле. AJAX ищет, далее строит список совпадений. Но у городов нужно в скобках вывести область и страну)
 
Посмотрите эти ссылки:
Скрытое содержимое доступно для зарегистрированных пользователей!

По первой ссылке простым языком рассказывается про нумерацию ключей в нестед сет деревьях, по второй примеры, как получать родителей. Чтобы ваши данные перегнать в нестедсет проще взять готовый класс, несложно ищется в гугле по запросу "nested set php class", написав простенький скрипт с использованием класса.

Но самый простой и надежный способ снизить нагрузку, это добавить текстовое поле к объекту, которому назначается город и вписывать туда при добавлении json-данные о полном местоположении. И в случае редактирования какого-то города запускать евент, который будет переименовывать по всей базе. Да долго, но долго один раз. Да и я что-то не часто слышу, что у нас города переименовывают)))

PS JSON-тип в мускуле и работа с этим типом в php появилась очень недавно, так что если софт обновлен до последнего, то стоит рассмотреть этот вариант.
 
Последнее редактирование:
Назад
Сверху