Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 89 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,89 @@
# java-filmorate
Template repository for Filmorate project.
# Filmorate DB

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

## Структура базы

- `users` — пользователи
- `films` — фильмы
- `genres` — жанры фильмов
- `rating` — возрастные рейтинги
- `film_genre` — связь "многие ко многим" между фильмами и жанрами
- `film_likes` — лайки пользователей
- `friends` — друзья пользователей

## Ссылка на диаграмму
https://dbdiagram.io/d/Filmorate-67fe8eaa9cea640381d41f06

## Примеры SQL-запросов

### Создать все таблицы
```sql
CREATE TABLE "films" (
"id" integer PRIMARY KEY,
"name" varchar(100) NOT NULL,
"description" varchar(200),
"release_date" timestamp,
"duration" integer,
"rating_id" integer
);

CREATE TABLE "rating" (
"id" integer PRIMARY KEY,
"title" varchar(20)
);

CREATE TABLE "film_likes" (
"user_id" integer,
"film_id" integer,
PRIMARY KEY ("user_id", "film_id")
);

CREATE TABLE "users" (
"id" integer PRIMARY KEY,
"email" varchar(100) NOT NULL,
"login" varchar(100) NOT NULL,
"name" varchar(100),
"birthday" timestamp
);

CREATE TABLE "genres" (
"id" integer PRIMARY KEY,
"title" varchar(100) UNIQUE NOT NULL
);

CREATE TABLE "film_genre" (
"film_id" integer,
"genre_id" integer,
PRIMARY KEY ("film_id", "genre_id")
);

CREATE TABLE "friends" (
"user_id" integer,
"friend_id" integer,
"confirmed" bool,
PRIMARY KEY ("user_id", "friend_id")
);

ALTER TABLE "films" ADD FOREIGN KEY ("rating_id") REFERENCES "rating" ("id");

ALTER TABLE "film_likes" ADD FOREIGN KEY ("user_id") REFERENCES "users" ("id");

ALTER TABLE "film_likes" ADD FOREIGN KEY ("film_id") REFERENCES "films" ("id");

ALTER TABLE "film_genre" ADD FOREIGN KEY ("film_id") REFERENCES "films" ("id");

ALTER TABLE "film_genre" ADD FOREIGN KEY ("genre_id") REFERENCES "genres" ("id");

ALTER TABLE "friends" ADD FOREIGN KEY ("user_id") REFERENCES "users" ("id");

ALTER TABLE "friends" ADD FOREIGN KEY ("friend_id") REFERENCES "users" ("id");
```

### Получить все фильмы с жанрами и рейтингом
```sql
SELECT f.id, f.name, f.description, r.title AS rating, g.title AS genre
FROM films f
LEFT JOIN rating r ON f.rating_id = r.id
LEFT JOIN film_genre fg ON f.id = fg.film_id
LEFT JOIN genres g ON fg.genre_id = g.id;
Binary file added db_schema.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class User {
private String login;
private String name;

@PastOrPresent(message = "Дата рождения пользователя не может быть в будущем")
@PastOrPresent(message = "Дата рождения пользователя не должна быть в будущем")
private LocalDate birthday;

public User(Long id, String email, String login, String name, LocalDate birthday) {
Expand Down
Loading