[英]TypeORM: most efficient way to create / update / remove multiple ManyToOne relations?
我有一個Project
實體和一個ProjectMember
實體,一個項目可以有多個成員。
我想要一個函數(使用type-graphql
)來處理成員的創建/更新/刪除。 我想出了 2 個解決方案,想知道哪個更有效:
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;
}
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.