Skip to content

Промежуточное задание 12-го спринта#3

Merged
NadezhdaTA merged 3 commits intomainfrom
add-data-base-diagram
Apr 2, 2025
Merged

Промежуточное задание 12-го спринта#3
NadezhdaTA merged 3 commits intomainfrom
add-data-base-diagram

Conversation

@NadezhdaTA
Copy link
Copy Markdown
Owner

No description provided.

Copy link
Copy Markdown

@russuAV russuAV left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Film

  1. Жанры
    • Сейчас в таблице Film присутствует поле genre, но по ТЗ у фильма может быть несколько жанров.
    • Если хранить genre как одно поле (например, genre_id), то получится связь один к одному — каждый фильм сможет иметь только один жанр.
    Рекомендация:
    Создать отдельную таблицу genres с полями id и name,
    а для связи «многие ко многим» — промежуточную таблицу film_genres (film_id, genre_id).
    Так один фильм сможет иметь несколько жанров, и один жанр — относиться к нескольким фильмам.

  2. AgeRating
    • В таблице Film поле ageRating указано как enum, а в таблице AgeRating ключом является id (int).
    Хотел уточнить: в таблице Film будет храниться числовое значение ID, соответствующее рейтингу,
    или строковое значение?

Если хранить строку (например "PG_13"), тогда при SQL-запросах типа:

SELECT * 
FROM films WHERE rating_id = 3;

фильмы с текстовым значением рейтинга не попадут в выборку.

User

  1. Дружба
    • Сейчас реализовано через таблицы FriendsList и Friendship.
    Чтобы получить статус дружбы, потребуется объединение двух таблиц,
    хотя это может быть оправдано, если предполагается расширение логики (например, больше 3 статусов).

Альтернатива:
Можно объединить всё в одну таблицу friendships с полями:
(user_id, friend_id, status)
Так получится упростить структуру и получить статус в одном запросе.

@@ -0,0 +1,10 @@
package ru.yandex.practicum.filmorate.model;

public enum Genre {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование enum для жанров ограничивает гибкость приложения. Например, если в будущем потребуется добавить новый жанр, это придётся делать через изменение кода enum, что приведёт к необходимости перекомпиляции.
Еще как вариант можно создать отдельный класс Genre с полями id и name, которые будут соответствовать полям в таблице genres в БД. Это позволит управлять жанрами динамически без изменения исходного кода.
Также в классе Film необходимо добавить коллекцию, которая будет хранить уникальные значения жанров, т.к их может быть несколько

Copy link
Copy Markdown
Owner Author

@NadezhdaTA NadezhdaTA Mar 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

решила пока не переделывать enum, тоже почитала про него и его совместимость с sql и думаю попробовать, хотя очень вероятно, что при создании таблиц и переделаю в объект с полями (как ты говоришь)
вообще хочу сделать таблицы с помощью herbinate, подключила зависимости, попробовала на Friends - вроде работает

@NadezhdaTA
Copy link
Copy Markdown
Owner Author

NadezhdaTA commented Mar 26, 2025

Переделала таблицу, как ты сказал, все связи сделала на id. Думаю, когда начнем создавать таблицы в проекте, то всё равно придется половину кода переделывать((
Добавила логику для работы с новыми полями

Copy link
Copy Markdown

@russuAV russuAV left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

поле Genre_id в таблице Film лишнее. Строка будет также хранить идентификатор одного жанра.

еще пару комментов оставил на усмотрение твое

Comment thread README.md
fr.friend_id
FROM user AS u
INNER JOIN friends AS fr ON u.user_id = fr.user_id
GROUP BY u.user_id;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GROUP BY вернет одну строку, соответсвенно и одного друга

User friend = getUserById(friendId);
userStorage.addFriend(user, friend);
Friends userFriend = new Friends(userId, friendId, friendStatus);
Friends friendFriend = new Friends(friendId, userId, Friendship.CONFIRMED);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

при добавлении в друзья сразу создаются две связи, одна из которых со статусом CONFIRMED, даже если вторая сторона ещё не принимала заявку

userStorage.addFriend(user, friend, userFriend, friendFriend);
}

public Collection<String> getFriendsList(int id) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

метод возвращает список имен друзей, а не самих пользователей(или их идентификаторы), что затрудняет идентификацию. Может возникнуть путаница, т.к имена могут повторяться. Но если ранее замечаний не было, то ок)

  • возможно стоит добавить признак дружбы (confirmed)

.collect(Collectors.toList());
}

public Collection<String> getCommonFriends(int userId, int friendId) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

метод также возвращает список имен. если ранее не было замечаний, то ок

@NadezhdaTA NadezhdaTA merged commit d12d3a7 into main Apr 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants