【问题标题】:How to compare a deck of cards with decks stored in database如何将一副纸牌与存储在数据库中的纸牌进行比较
【发布时间】:2019-12-04 08:35:40
【问题描述】:

我正在一个项目中使用 Spring Boot 和 MySQL,我使用 3rd 方 Web API 来提取玩家的游戏日志,并查看他在过去 20 场左右的“战斗”中使用了哪些套牌。

目前,我有三张桌子,每张都标有牌组、牌组卡和卡片。游戏中有大约 100 张牌,每副牌包含 8 张牌。我将这种关系归类为 Deck 和 Card 实体之间的多对多双向关系,因为每个牌组包含不止一张牌,并且每张牌都可以分配给许多不同的牌组。我接着创建了 deck_cards,它保存了每个表的主键 (id)。

现在,我可以从 API 获得的信息是每个玩家在战斗中使用的 8 张牌。 JSON 响应包括卡片的 ID,这些卡片构成了战斗中使用的套牌。我唯一的问题是,我不知道如何对照已存储在 db 中的卡组检查该卡组,以免存储重复项。是否有可以帮助解决此问题的 JPA/Spring Boot 函数或 SQL 语句?提前谢谢你。

public class Deck {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToMany(fetch = FetchType.LAZY,
                cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE
                })
    @JoinTable(name = "deck_cards",
        joinColumns = { @JoinColumn(name = "deck_id")},
        inverseJoinColumns = { @JoinColumn(name = "card_id")})
    private Set<Card> cards = new HashSet<>();
    //...
}

public class Card {
    @Id
    private Integer id;

    @NotBlank
    private String name;

    @ManyToMany(fetch = FetchType.LAZY,
                cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE
                },
                mappedBy = "cards")
    private Set<Deck> decks;

    //...
}

【问题讨论】:

    标签: mysql sql spring-boot jpa spring-data-jpa


    【解决方案1】:

    使用给定的数据模型和 SQL,您可以执行以下操作来获取包含给定卡片的卡片组的 deck_id。这仅适用于卡片在套牌中是独一无二的,因为您使用的是一套卡片。

    select deck_id
    from deck_cards
    where card_id in :cardids
    group by deck_id
    having count(*) = 8
    

    或者,您可以在卡片组中引入一个新列,其中包含卡片组中所有卡片的 ID,按升序填充到固定长度。 所以前 8 张牌的牌组类似于:0001020304050607 假设 id 以 0 开头。

    这个字符串可以很容易地从 8 张卡片中构造出来,并用于检查它是否在数据库中。您甚至可以在其上放置一个唯一索引。

    【讨论】:

    • 让我试试这个,但它看起来应该可以工作!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 2022-11-25
    • 2023-03-20
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多