Skip to content

Repository files navigation

java-filmorate

Веб-приложение для оценки фильмов и общения с друзьями.

Схема базы данных

Диаграмма связей между таблицами (основные сущности: пользователи, фильмы, справочники жанров и рейтингов MPA; связи: дружба со статусом, лайки, жанры фильмов).

Схема базы данных Filmorate

Пояснение к схеме

  • users - пользователи (email, логин, имя, дата рождения).
  • films - фильмы (название, описание, дата релиза, длительность); рейтинг MPA хранится по ссылке на справочник.
  • mpaa_ratings - справочник рейтингов MPA (G, PG, PG-13, R, NC-17).
  • genres - справочник жанров (Комедия, Драма, Мультфильм и др.).
  • film_genre - связь «фильм - жанр» (у одного фильма может быть несколько жанров).
  • user_friends - дружба между пользователями с направлением и статусом: UNCONFIRMED (запрос отправлен) или CONFIRMED (дружба подтверждена).
  • film_likes - лайки пользователей фильмам (пара film_id, user_id).

Примеры запросов для основных операций (? обозначает переменные значения)

Получить всех пользователей:

SELECT * FROM users;

Получить все фильмы с рейтингом MPA:

SELECT f.*, r.code AS mpaa_rating
FROM films f
LEFT JOIN mpaa_ratings r ON f.mpaa_rating_id = r.id;

Получить топ N самых популярных фильмов по количеству лайков:

SELECT f.*, COUNT(fl.user_id) AS likes_count
FROM films f
LEFT JOIN film_likes fl ON f.id = fl.film_id
GROUP BY f.id
ORDER BY likes_count DESC
LIMIT ?;

Получить список друзей пользователя (только подтверждённая дружба):

SELECT u.*
FROM users u
JOIN user_friends uf ON u.id = uf.friend_id
WHERE uf.user_id = ? AND uf.status = 'CONFIRMED';

Получить общих друзей двух пользователей:

SELECT u.*
FROM users u
JOIN user_friends uf1 ON u.id = uf1.friend_id AND uf1.user_id = ? AND uf1.status = 'CONFIRMED'
JOIN user_friends uf2 ON u.id = uf2.friend_id AND uf2.user_id = ? AND uf2.status = 'CONFIRMED';

Добавить запрос в друзья (неподтверждённая связь):

INSERT INTO user_friends (user_id, friend_id, status)
VALUES (?, ?, 'UNCONFIRMED');

Подтвердить дружбу (после принятия запроса):
Обновить обе направленные связи: сначала строку (A, B), затем (B, A). Например, A отправил запрос, B принял - тогда первый UPDATE с параметрами (A, B), второй с (B, A).

UPDATE user_friends SET status = 'CONFIRMED' WHERE user_id = ? AND friend_id = ?;  -- параметры: (A, B)
UPDATE user_friends SET status = 'CONFIRMED' WHERE user_id = ? AND friend_id = ?;  -- параметры: (B, A)

Поставить лайк фильму:

INSERT INTO film_likes (film_id, user_id) VALUES (?, ?);

Удалить лайк:

DELETE FROM film_likes WHERE film_id = ? AND user_id = ?;

Получить жанры фильма:

SELECT g.* FROM genres g
JOIN film_genre fg ON g.id = fg.genre_id
WHERE fg.film_id = ?;

Участники проекта

Участник Функциональность
MaxVolkov-GM Функциональность «Рекомендации»
saleevakate Удаление фильмов и пользователей; вывод самых популярных фильмов по жанру и годам; функциональность «Лента событий»; функциональность «Поиск»
Somud97 Функциональность «Отзывы»
MusMur1995 Добавление режиссёров в фильмы; функциональность «Общие фильмы»

About

Template repository for Filmorate project.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages