@Shura
Shura
11 Nov 2015

Вод думаю над структурой базы.
Пост, например может выглядеть как-то так:

{
    tags: ["tag1", "tag2", "tag3"],
    track: trackid,
    title: "Название",
    date: 1262333829,
    author: "Иван Иванов",
    text: "Тут сам текст поста в html"
}

в track можно и сам трек хранить в geojson, но я решил, что leaflet трек наверное будет отдельным запросом дёргать, поэтому его лучше отдельно положить.
Вот что я не решил, так это индексы, не понятно, по какому полю будет идентифицироваться пост. Вроде поле времени для этого подходит, но с другой стороны не соображу как потом сделать паджинацию для общей ленты. Пока оставлю вопрос открытым, в случае чего - добавлю какое нибудь поле с автоинкрементом, в монге с ним не всё так просто, но можно изловчиться.

А еще вопрос с фотками. Хранить отдельными файлами или в базе? Склоняюсь к базе.

11 Nov 2015

Shura, зачем монго, если постгрес умеет то же самое, только лучше

11 Nov 2015

Shura,

Вроде поле времени для этого подходит, но с другой стороны не соображу как потом сделать паджинацию для общей ленты.

А в чём проблема с паджинацией для общей ленты, если ты проиндексируешь по времени? (Я бы ещё по тегам проиндексировал).

11 Nov 2015

А как потом последние посты выдёргивать? Выдёргивать все, сортировать по времени и брать 10 максимальных? Выдёргивать все посты это не слишком ли тяжёлая операция?

#ipaiz/4 в ответ на /3
11 Nov 2015

Shura, ну ты что? Попросить монгу выдать 10 первых постов из сортированных по дате по убыванию. В её консоли это типа

db.articles.find({}, { title: 1, pubdate: 1 }).sort({ pubdate: -1 }).skip(50).limit(10) // Показать шестую страницу постов (10 постов на странице)
#ipaiz/5 в ответ на /4
11 Nov 2015

Ну и когда ты такое пишешь, это не значит, что бедная монга такая сначала находит все статьи, потом сортирует их, еле ворочаясь, потом выдёргивает первые 50 и потом наконец отдаёт тебе последние 10. Это значит, что монга запоминает, что тебе надо из списка упорядоченных статей выдернуть с 51-й по 60-ю. И делает это довольно быстро, если у тебя индексы есть.

#ipaiz/6 в ответ на /5
11 Nov 2015

Грамотно составленный индекс — уже полдела :) Я думаю, пока хватит двух индексов:

  1. По дате.
  2. По тегам, затем по дате.

Этого достаточно, чтобы делать общую пагинацию и пагинацию на странице типа /tag/ololo.

Само собой, тебе надо ещё проиндексировать по урлу. Ну, чтобы страница с одной статьёй не думала 100 лет.

Будешь прикручивать поиск — прикрутишь индексы по телу и заголовкам.

#ipaiz/7 в ответ на /6
11 Nov 2015

Понял, значит так и сделаю. Про поиск я пока ещё не задумывался, а по урлу по идее нгинкс кешировать должен. В базе у меня урлы храниться не будут

#ipaiz/8 в ответ на /6
11 Nov 2015

Shura, а как строится урл страницы? Должен же быть какой-то уникальный идентификатор, по которому ты будешь вытаскивать нужную статью.

#ipaiz/9 в ответ на /8
11 Nov 2015

Shura, ну и фотки я бы тоже в базе не стал хранить. Читает чувак твою статью, картинка понравилась и он ссылку скинул другу. Друг пошёл по ссылке, а твой нжинкс пошёл к твоему приложению, а приложение пошло в базу. Хотя нжинкс сам мог бы отдать картинку, если бы она лежала файлом.

12 Nov 2015

Будет что-то вроде getpost?q=id, где id это как раз индекс поста, поле date

#ipaiz/11 в ответ на /9
12 Nov 2015

Может тогда разумнее вообще всё на статике сделать? При создании новой статьи сразу генерим статику. А динамику оставить только для поиска

#ipaiz/12 в ответ на /10
12 Nov 2015

Shura, может и так :) Но я почему-то решил, что ты ещё хочешь монгу опробовать.

#ipaiz/13 в ответ на /12
12 Nov 2015

Shura, могу тебе порекомендовать онлайн-курсы в MongoDB University. Я сам проходил у них курс «MongoDB for Node.js devs», мне очень понравилось. Лекции коротенькие, в них объясняется какая-то одна простая тема. Буквально 3 минуты. Но бывают большие лекции, минут по 15 — по сложным темам. После каждой лекции простой тест на тему лекции. Понял ты её или не понял. Не понял — посмотришь ещё раз. Каждую неделю примерно бывает «домашнее задание». Его иногда можно сделать прям на сайте, иногда надо сделать на своей машине и запустить проверялку. За домашнее задание ты получаешь баллы. В конце курса экзамен, за него тоже получаешь баллы. Баллы суммируются, и вот твой итоговый результат. Если много набрал, ещё и сертификат дадут (я набрал 95%). Попробуешь всё от самых основ, с которыми ты вот сейчас возишься, до аггрегейшн фреймворка, настройки репликации и шардинга. Курс длится где-то полтора месяца. У меня это занимало примерно по 10-15 минут в день, если короткая лекция и тест, и час-полтора, если сложная домашка. Очень хорошую базу они дают, я щитаю.

#ipaiz/15 в ответ на /14
12 Nov 2015

isqua, не нашёл там цены. Это платно или нет?

#ipaiz/16 в ответ на /15

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.