#javascript #typeorm
#javascript #typeorm
Вопрос:
У меня есть 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;
}
Для решения 1, поскольку ProjectMember
s сохраняются независимо, задействовано слишком много доступа к БД (я думаю; пожалуйста, укажите, если я ошибаюсь);
И для решения 2 я должен предоставить все существующие ProjectMember
s, что делает ввод members
большим.
Итак, какой из них предпочтительнее?
Ответ №1:
Поскольку каждое сохранение связано с:
- подключение (если не подключено)
- отправка запроса на сервер
- запрос синтаксического анализа
- вставка строки
- вставка индексов
- закрытие (опции — вы сохраните соединение)
Как правило, если вы используете оператор со многими insert одновременно, вы должны использовать INSERT со многими ЗНАЧЕНИЯМИ. Это быстрее, иногда во много раз быстрее, потому что вы отправляете данные один раз, вы анализируете запрос один раз, вы индексируете один раз и т. Д. … поэтому второй подход лучше
Но вы можете повысить скорость первого подхода с помощью транзакций