Как мне определить отношения сущностей в базе данных коллекции игр?

#java #spring #database #hibernate #jpa

Вопрос:

У меня есть приложение для сбора игр, в котором я хочу создавать отдельные списки игр. Я использую Spring JPA и Hibernate в бэкэнде, и именно так сейчас выглядят классы сущностей.

 @Entity
public class Game {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "game_genre",
        joinColumns = @JoinColumn(name = "game_id"),
        inverseJoinColumns = @JoinColumn(name = "genre_id"))
    private Set<Genre> genres;
    
    private int rating;

    @ElementCollection
    private List<String> platforms;

    private String publisher;
    
    private LocalDate releaseDate;

    @ManyToOne
    private GameShelf gameShelf;
}
 
 @Entity
public class GameShelf {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "gameShelf")
    private Set<Game> games;
}
 
 @Entity
public class Genre {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @ManyToMany(mappedBy = "genres")
    private List<Game> games;

}
 

Я не уверен, что это вообще правильный подход… В конце концов, я хочу создать приложение Spring Boot, в котором пользователи смогут входить в систему (еще не реализовано) и управлять своими собственными списками (ноль или более списков для каждого пользователя).

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

Есть ли здесь лучший подход? И, может быть, существует обобщенный подход к решению подобных проблем с отношениями с базами данных, который я могу применить к будущим проблемам?

Комментарии:

1. Трудно сказать, не видя сопоставления для пользователя и его связи с игрой или полкой… «управляйте своими собственными списками (ноль или более списков для каждого пользователя)» Списками чего? Игры? Полки?

2. Пользователи @SteveEbersole могут создавать полки, на которые они затем могут добавлять игры вручную через конечную точку веб-службы. Предполагается, что это станет простым приложением для управления мультимедиа, в котором вы сможете создавать списки (полки) и добавлять игры вручную в каждую.

3. Итак, вы спрашиваете, будет ли игра (например, «Последний из нас») повторяться, если несколько пользователей добавят ее на свою полку? Как правило, вы хотели бы нормализовать это — для этой игры была бы только одна строка. Именно так лучше всего работают реляционные базы данных — нормализованные


Ответ №1:

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