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