@we1

Как реализовать структуру БД для списка однотипных объектов из разных мест?

Добрый день.

Уже довольно долго ломаю голову над структурой базы данных, чтобы ее было удобно использовать. Задача, как мне кажется, довольно стандартная. Проще всего ее будет описать на примере усредненного прогноза погоды из разных источников:
У нас есть список городов, и для каждого из них указывается от одного до нескольких источников. Регулярно запускаемый скрипт должен доставать по одной ссылке на источник и получать оттуда информацию. То есть нужно по очереди сначала опрашивать все ссылки на город А, потом все ссылки на город Б, и т.д. по очереди. Однако самая простая идея хранения всех ссылок в одной записи и добавления специального поля, в котором бы с помощью флага обозначалась «законченность» опроса этого города мне не нравится.

Есть вариант с метками времени, когда указывается время последней проверки и в следующий раз из списка выбирается самая старая дата. Этот вариант всем хорош, кроме случая, когда случайные сбои приводят к нарушению порядка (ведь последовательность разных ссылок-источников для одного города в этом случае никак не связана, и можно получить ситуацию, когда последний источник проверяется через много часов после первого, то есть актуальность погоды уже другая). Хотелось бы получить простую систему, когда один объект-город опрашивался в «пакете» за минимально короткое время (при старте скрипта раз в минуту, четыре ссылки для одного города будут получены за время чуть более трех минут), а не растягивался на неопределенное время, когда разные ситуации могут приводить к тому, что метки времени будут рассинхронизорованы и опрос всех ссылок для одного объекта будет значительно растянут во времени и разбит запросами по другим объектам.

Хотелось бы узнать элегантную схему решения этой задачи. Возможно кто-то сталкивался и имеет варианты?

Дополнение. Все ссылки вводятся изначально, а не генерируются на лету, то есть они могут быть очень разными, по идентификаторам или каким-то правилам их сформировать нельзя и нужно обязательно где-то хранить.
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
`cities` (`id`, `name`, `lastCheckTimestamp`, ...)
`urls` (`id`, `city_id`, `url`, `lastCheckTimestamp`)
SELECT `c`.`id` AS `city_id`, `u`.`id` AS `url_id`, `u`.`url` AS `url`
  FROM (
    SELECT `id`, `lastCheckTimestamp` 
      FROM `cities` 
      ORDER BY `lastCheckTimestamp` 
      LIMIT 1
  ) AS `c` 
  LEFT JOIN `urls` AS `u` ON `u`.`city_id` = `c`.`id`
    AND `u`.`lastCheckTimestamp` < `c`.`lastCheckTimestamp`
  LIMIT 1

Если запрос вернул url, то обработать его и изменить `lastCheckTimestamp` в urls
Если не вернул, то изменить `lastCheckTimestamp` в cities и снова выполнить первый запрос
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы