在数组中保存实体的重复实例以实现多对多关系

问题描述 投票:0回答:0

我正在使用 Postgres 和 TypeORM(以及 GraphQL,尽管不太相关)为集换式纸牌游戏设计数据库。牌组需要能够在其中保存同一张牌的多个实例,因为牌组最多允许有一张牌的 4 个副本。当我将一副牌保存到包含一组具有重复实体的卡片的数据库中时,实际保存的只是唯一的卡片,没有重复的副本。 这是 Postgres 或 TypeORM 的限制/怪癖,还是这只是一般关系数据库的限制?如果我根本无法在这样的关系中保存重复项,那么保存一副牌中每张牌的数量的最佳解决方案是什么?

以下是相关代码的简化片段:

@ObjectType()
@Entity()
export class Deck extends BaseEntity {
    // snip
    @Field(() => [Card])
    @ManyToMany(() => Card, { eager: true })
    @JoinTable()
    cards!: Card[];
    // snip
}

前面是单向关系,

Card
没有
Deck
相关的列。

const deck = await Deck.create({
    // snip
    cards: cardsWithDuplicates,
    // snip
}).save();

之前对

Deck.create().save()
的调用在控制台中产生以下输出:

query: START TRANSACTION
-- snip
query: INSERT INTO "deck_cards_card"("deckId", "cardId") VALUES ($1, $2), ($3, $4), ($5, $6), ($7, $8) -- PARAMETERS: [16,259,16,260,16,261,16,262]
query: COMMIT

正如您在参数中看到的那样,即使数组

cardId
包含每张卡片的多个实例,它也只会插入每个唯一的
cardsWithDuplicates
(259、260、261、262)中的 1 个。

我一直无法在网上找到与我的问题相关的任何信息,尽管我缺乏数据库知识/经验可能意味着我根本不知道如何最好地表达这个问题。欢迎任何建议/批评。

typescript database postgresql many-to-many typeorm
© www.soinside.com 2019 - 2024. All rights reserved.