---
# System prepended metadata

title: Untitled

---


## Problems

### Задача "Социальные данные"

Мы проектируем новую социальную сеть с тремя типами сущностей - Пользователи, Ресурсы и Комментарии. Ресурс - объект, представляющий веб-ресурс в интернете, он имеет такие атрибуты как url, title и т.д. Пользователи могут подписываться друг на друга, просматривать и комментировать страницу любого Ресурса. На странице Ресурса отображается сама веб-страница, а также комментарии и посещения пользователей, на которых подписан текущий пользователь.

Необходимо спроектировать структуру БД и логику метода API, который возвращает комментарии и посещения ресурса совершенные пользователями, на которых подписан текущий пользователь.

Комментарии нельзя обновлять и удалять.

```
GET /resources/:resourceId/social-data

{
    // список комментариев
    comments: [{id: 1, text: 'Comment text', userId: 1}, ...], 
    // список пользователей
    viewedBy: [{id: 1, name: 'Ivan'}, ...] 
}
```

```
Структура сущностей:

Resource {
    id: int
    url: string
    title: string
}

User {
    id: int
    name: string
}

Comment {
    id: int
    userId: int
    text: string
}

View {
    id: int
    userId: int
    resourceId: int
}
```

**Вопросы**
- какую БД выберешь и почему?
- как устроены сущности в БД?
- что и как будешь кэшировать?

---

## Extented

**Общие понятия**
- OOP vs Чистые функции (является детерминированной; не обладает побочными эффектами.) / детерминированность / идемпотентность
- SOLID, MVC
- Паттерны проектирования (типы и примеры)
- REST
- Git

**Архитектура**
- CAP theorem (объяснить каждое из трех, примеры)

**JS**
- Map и Set как устроены и чем отличаются
- What's the difference between Map/Set and WeakMap/WeakSet ? (Keys cannot be primitive types for WeakMap/WeakSet. Keys are objects and are "weakly" held)
- generator

**SQL**
- JOIN (зачем? типы joins)
- TRANSACTION (зачем? типы транзакций)
- ORM (какие? зачем?)