首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeORM:@JoinTable有三列

TypeORM:@JoinTable有三列
EN

Stack Overflow用户
提问于 2019-02-26 15:54:38
回答 1查看 4.3K关注 0票数 4

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

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

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

代码语言:javascript
复制
recipe
- id INT(11)
- name VARCHAR(255)
# PRIMARY KEY is id
代码语言:javascript
复制
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
代码语言:javascript
复制
step
- id INT(11)
- name VARCHAR(255)
- recipeId INT(11)
# PRIMARY KEY is id
# FOREIGN KEY is recipeId on recipe

所以,这是我的食谱的三个主要实体。一个菜谱可以有多个步骤(many-steps-to-one-recipe),一个菜谱可以有多个成分(many-ingredients-to-one-recipe)

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

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
@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,这样的装饰器,在这里我可以为实体步骤提供两列。

如果你们中有人能帮我做这件事,那就太好了。也许有必要向你提供更多关于其他实体的信息?

亲切的问候,

数字黑客

EN

回答 1

Stack Overflow用户

发布于 2019-02-26 17:19:22

每个关系都应该在自己的表中。如果在一个表中表示两个关系,则会创建重复,并可能导致不一致。

示例

让我们假设您有一个菜谱MyRecipe,它有一个步骤Step1,其中包含两个成分。现在,您希望将Step1移到另一个菜谱OtherRecipe。由于关系MyRecipe <-> Step1被表示了两次(复制),所以您必须更改多个条目。如果您忘记了一个,您将以损坏的数据结束。

代码语言:javascript
复制
ingredient_steps_step:
MyRecipe <-> Step1 <-> IngredientA
MyRecipe <-> Step1 <-> IngredientB

我将对这些数据进行如下建模:

代码语言:javascript
复制
steps:
Step1 -> MyRecipe

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

这样你就不会有重复了。我假设一个食谱的成分是所有步骤的成分的结合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54889429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档