You are viewing [info]grey3's journal

grey3's Journal
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 1 most recent journal entries recorded in grey3's LiveJournal:

    Saturday, June 12th, 2010
    7:26 pm
    SQL vs NoSQL: а как всё-таки лучше?
    [info]asinitsyn > "Как DBA с опытом,"
    >[info]zamotivator > "3. Я программист, который занимается разработкой движков СУБД"
    Хочу задать вопрос одновременно ОБОИМ собеседникам: как в реляционных СУБД, например MySQL, эффективно решить заданный в посте [info]rainman_rocks "Зачем NoSQL программистам" пример: эффективно извлечь несколько записей с подзаписями-списками?

    Например, в турбюро на веб-страничке надо показывать маршруты вместе с датами. Дат у маршрута, понятное дело, может быть сильно переменное количество - от нуля до сотни. У каждого маршрута есть длинное описание, его тоже надо показать.
    1. Тупое решение в лоб - запросить сначала список маршрутов с описаниями, и в цикле для каждого запрашивать даты к нему (поскольку это отдельная связанная таблица). Для N маршрутов понадобится N+1 запросов, что слишком "дорого" по времени.
    2. Тупое обходное решение: в 1 запросе дублируем данные о маршруте в каждой строке. Строится JOIN, результат GROUP BY, и просто игнорируем маршрут и повторное его описание для каждой следующей даты того же маршрута, выдавая описание однократно лишь в момент смены маршрута. Но если данных о маршруте много - опять получаем сильный перерасход времени и памяти на ненужное многократное дублирование информации.
    3. Сложное обходное решение в 2 запроса: запросив сначала список маршрутов, далее запрашиваем общий список дат для этих маршрутов, используя IN (вложенный SELECT). Далее по второму запросу строим в памяти списки дат к каждому маршруту (то есть хеш списков), и в процессе обработки первого запроса добавляем к нему соответствующий список. Получаем экономию времени базы, но тратим время и память (причём примерно столько же сколько в варианте 2) на составление списков.
    4. Полемическое решение: заменяем MySQL на NoSQL, выдающий готовые JSON-строки маршрутов с массивами дат, и передаём их через AJAX прямо в броузер пользователя - пусть клиентская машина занимается рендерингом. Экономим и на базе, и на обработке.

    Какой новый, улучшенный вариант могут предложить DBA с опытом и разработчик движков? Или хоть аргументировано поддержать один из первых трёх вариантов?
    Почему бы разработчику движков не сделать, как минимум, возможность при обработке запросов с GROUP BY выдать специальное значение группируемого поля "смотри выше" (аналогично спецзначению NULL)? А ещё лучше, сделать расширение, способное эффективно извлекать массивы/списки из связанных таблиц в одном запросе с основной таблицей?
About LiveJournal.com