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

Тема в разделе "Как сделать...", создана пользователем danneo, 8 янв 2016.

  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Есть города, страны. Кэш грузит на 14 Мб.
    Нужно делать, например:
    Выводить всю строку родителей: страна, область, город. Например, в speebdar, title, адресе
    Вывести зависимое меню из тех же страна, область, город
    Вывести блок с выбором городов для выбора города (фильтрация товаров на сайте). На нем список городов с разбивкой на области, страны. Пример: любой крупный интернет-магазин, авито и т.п.
    Сейчас все города в одной таблице через parentid. Сохраняю все в кэш в виде массива. Но он весит много.
    Как решаются такие задачи, кто знает?
     
  2. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    Разбей на несколько таблиц. Город, область итд.
    + подгружать по ajax по необходимости. это самый простой вариант и нагрузка 0.
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    и как я буду подгружать speedbar?, meta-description, адрес. ajax только для зависимых списков используют же.
    И как выводить список фильтрации контента (выбор города)? Т.е. рекурсия всех городов по странам, областям и городам.
     
  4. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    Подгружайте только то что нужно в текущий момент
     
  5. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Вы только одну сторону рассматриваете - ajax списки
    1. для поисковиков тоже нужны ссылки.
    2. например, нужновывести TITLE страна/область/город. Как это вывести? Это получается, нужно сначала вывести название города, получить его parenid, далее запрос на область, получить ее parentid, а затем запрос на страну, получить ее название и прочие данные. А это 3 запроса. Это я не про ajax, а php - формирование страницы.
    Далее. Мне нужно вывести страницу со списком городов. Города есть одинаковые. Поэтому к ним нужно вывести области. Делаю запрос на все города. Далее, делаю для каждого города запрос, чтобы вывести область. Далее еще запрос, чтобы вывести страну, чтобы сгруппировать по странам.
    Так получается?
     
  6. strong

    strong Писатель

    Регистр.:
    18 янв 2008
    Сообщения:
    3
    Симпатии:
    3
    Попробуйте Nested Set Tree применить к вашей задаче. Есть уже готовые классы для работы с деревом, если писать некогда. Зато вы можете одним селектом вытащить сразу всю последовательность Страна/Область/Город/Район/Улица/ итд...
     
    danneo нравится это.
  7. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.421
    Симпатии:
    109
    Это то, что нужно. Только ничего не понял, никогда не сталкивался.
    Можете помочь?
    У меня таблица:
    Код:
    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 ищет, далее строит список совпадений. Но у городов нужно в скобках вывести область и страну)
     
  8. strong

    strong Писатель

    Регистр.:
    18 янв 2008
    Сообщения:
    3
    Симпатии:
    3
    Посмотрите эти ссылки:

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

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

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