簡體   English   中英

TypeORM:創建/更新/刪除多個多對一關系的最有效方法?

[英]TypeORM: most efficient way to create / update / remove multiple ManyToOne relations?

我有一個Project實體和一個ProjectMember實體,一個項目可以有多個成員。

我想要一個函數(使用type-graphql )來處理成員的創建/更新/刪除。 我想出了 2 個解決方案,想知道哪個更有效:

  1. 多方面save
@Mutation((returns) => Boolean)
async modifyProjectMembers(
  @Arg("project") projectId: number,
  @Arg("members", (type) => [ProjectMemberInput])
  members: ProjectMemberInput[]
): Promise<Boolean> {
  const project = await Project.findOneOrFail(projectId);

  for (let i = 0; i < members.length; i++) {
    const { id, remove, ...info } = members[i];
    if (!!id) {
      // updating existing
      const oldMember = await ProjectMember.findOneOrFail(id);
      if (remove) {
        await oldMember.remove();
        continue;
      }
      Object.assign(oldMember, info);
      await oldMember.save();
    } else {
      // creating new
      const newMember = ProjectMember.create(info);
      newMember.project = project;
      await newMember.save();
    }
  }
  return true;
}
  1. 一方面save
@Mutation((returns) => Boolean)
async modifyProjectMembers(
  @Arg("project") projectId: number,
  @Arg("members", (type) => [ProjectMemberInput])
  members: ProjectMemberInput[]
): Promise<Boolean> {
  const project = await Project.findOneOrFail(projectId);

  let newMembers = [];
  for (let i = 0; i < members.length; i++) {
    const { id, remove, ...info } = members[i];
    if (!!id) {
      if (remove) {
        continue;
      }
      // updating existing
      const oldMember = await ProjectMember.findOneOrFail(id);
      Object.assign(oldMember, info);
      newMembers.push(oldMember);
    } else {
      // creating new
      const newMember = ProjectMember.create(info);
      newMembers.push(newMember);
    }
  }
  project.members = newMembers;
  await project.save();
  return true;
}

對於方案一,由於ProjectMember是獨立保存的,所以涉及到的數據庫訪問過多(我認為;如果我錯了,請指出);

對於解決方案 2,我必須提供所有現有的ProjectMember s,這使得輸入members大。

那么,哪個更受歡迎呢?

因為每次保存都與:

  • 連接(如果未連接)
  • 向服務器發送查詢
  • 解析查詢
  • 插入行
  • 插入索引
  • 關閉(選項 - 您將保持連接)

通常,如果您同時使用具有多個插入的語句,則應該使用具有多個值的 INSERT。 這更快,有時要快很多倍,因為你發送一次數據,你解析一次查詢,你索引一次等等......所以第二種方法更好

但是您可以通過使用事務來提高第一種方法的速度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM