gpt4 book ai didi

sql - TypeORM: @JoinTable 三列

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:24 24 4
gpt4 key购买 nike

我有一个关于 typeorm 和 @JoinTable- 和 @RelationId-Decorator 的问题。也许任何人都可以帮助回答我的问题,给我提示或理想地解决我的问题。

我正在使用带有 typeorm 的 nestjs 来为我和我的家人提供一个带有食谱的私有(private) api。

如果我将数据库结构分解到最低限度,我们会得到三个主要实体:

recipe
- id INT(11)
- name VARCHAR(255)
# PRIMARY KEY is id

ingredient
- id INT(11) // not autoincrement, fetched from https://www.programmableweb.com/api/chomp
- name VARCHAR(255)
- recipeId INT(11)
# PRIMARY KEY is a composite key (id, recipeId)
# FOREIGN KEY is recipeId on recipe

step
- id INT(11)
- name VARCHAR(255)
- recipeId INT(11)
# PRIMARY KEY is id
# FOREIGN KEY is recipeId on recipe

所以,这些是我的食谱的三个主要实体。一个食谱可以有多个步骤(许多-steps-to-一个-recipe)并且一个食谱可以有多个成分(许多-ingredients-到-一个-食谱)

现在是复杂的部分。每个步骤可以与一种或多种成分相关。这导致以下关系表。

ingredient_steps_step
- ingredientId INT(11)
- stepId INT(11)
- recipeId INT(11)
# PRIMARY KEY is a composite key (ingredientId, stepId, recipeId)
# FOREIGN KEYS are ingredientId on ingredient, stepId on step, recipeId on recipe

我的 ingredient.entity.ts 看起来像这样:

@ManyToMany(type => Step, step => step.ingredients)
@JoinTable({
name: 'ingredient_steps_step',
joinColumns: [
{name: 'ingredientId'},
{name: 'recipeId'},
],
inverseJoinColumns: [
{name: 'stepId'},
],
})
steps: Step[];

@RelationId((ingredient: Ingredient) => ingredient.steps)
stepIds: number[];

@PrimaryColumn()
recipeId: number;

@PrimaryColumn()
id: number;

@ManyToOne(type => Recipe, recipe => recipe.ingredients)
recipe: Recipe;

问题是,我的配料表已填满,但关系表 (ingredient_steps_step) 未填满条目。问题是,没有像 @RelationIds 这样的装饰器,我可以在其中为与实体步骤 的关系提供两列。

如果你们中的任何人可以帮助我解决这个问题,那就太好了。也许有必要向您提供有关其他实体的更多信息?

亲切的问候,

数字黑客

最佳答案

每个关系都应该在它自己的表中。如果您在一张表中表示两种关系,则会产生重复并可能以不一致告终。

例子

假设您有一个食谱 MyRecipe,其中一个步骤 Step1 包含两种成分。现在您想将 Step1 移动到另一个配方 OtherRecipe。因为关系 MyRecipe <-> Step1出现两次(重复),您必须更改多个条目。如果您忘记了一个,您最终会得到损坏的数据。

ingredient_steps_step:
MyRecipe <-> Step1 <-> IngredientA
MyRecipe <-> Step1 <-> IngredientB

我会按如下方式对数据建模:

steps:
Step1 -> MyRecipe

step_ingredients:
Step1 <-> IngredientA
Step1 <-> IngredientB

这样,您就不会重复。我假设食谱的成分是其所有步骤的成分的结合。

关于sql - TypeORM: @JoinTable 三列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com