SQL: Node.js를 사용한 최적의 방식으로 일대다 조인 쿼리
14256 단어 javascriptnodesqltutorial
그렇다면 SQL의 일대다 관계는 무엇입니까?
공식적으로 A 일대다 관계는 두 엔터티 A와 B 간의 관계를 나타내는 카디널리티 유형으로, A의 요소는 B의 여러 요소에 연결될 수 있지만 B의 구성원은 단 하나의 요소에만 연결됩니다. ㅏ.
일대다와 함께 일대일 및 다대다 관계도 있지만 이 기사에서는 일대다에 중점을 둡니다.
하나의 레코드만 다른 레코드와 연결되므로 일대일 관계가 더 쉽습니다. 단일 조인으로 두 테이블에서 원하는 데이터를 검색할 수 있습니다.
Many to Many Relation은 두 개의 One To Many Relationships로 이루어지므로 여기에서 논의하는 아이디어도 적용될 수 있습니다.
그래서 우리는 여기서 무엇을 논의하고 있습니까?
사용자 및 사용자 취미 테이블이 있고 각 사용자는 많은 취미를 가지고 있으며 각 취미는 한 사용자에게만 속한다고 상상해 보십시오.
Hobbies 테이블에 대해 쿼리를 수행하면 사용자와 쉽게 조인하여 취미와 관련된 사용자 정보를 검색할 수 있습니다.
하지만 도움이 되나요? 취미 목록? 사실 대부분의 경우 아니요, 취미가 있는 사용자 목록이 필요하며 사용자 개체 배열이 바람직합니다. 각 사용자 개체에는 사용자 개체에 포함된 취미 배열인 속성이 있어야 합니다.
좋습니다. 하지만 사용자와 관련하여 취미를 가져오기 위해 취미가 있는 사용자 테이블에 조인을 만들 수는 없습니까? 다시 말하지만, SQL은 그런 식으로 작동하지 않으며 NoSQL 데이터베이스와 같지 않으며 이러한 종류의 쿼리를 지원하지 않습니다.
흠 Node.js 또는 다른 것과 같은 백엔드 언어를 사용하여 별도의 쿼리에서 사용자 목록을 찾은 다음 모든 항목과 각 반복을 반복하여 취미 테이블에 쿼리하고 포함시키려면? 이것은 실제로 작동합니다. 올바른 결과를 얻을 수 있지만 이것은 루프에서 데이터베이스를 공격할 때 최악의 접근 방식 중 하나입니다.
따라서 DB를 손상시키지 않고 DB에 너무 많은 연결을 만들지 않으면서도 동일한 출력을 달성하는 최적의 방법으로 이 작업을 수행해 보겠습니다.
먼저 SQL에서 아래 스키마로 이 두 테이블을 생성할 것입니다. 가장 간단한 형태입니다.
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `user_hobbies` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL DEFAULT '0',
`hobby_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
);
이제 테이블이 생성되었으므로 작업할 항목을 가질 수 있도록 일부 더미 데이터를 테이블에 넣을 것입니다.
내가 SQL 관계 없이 User_id를 추가하고 있다는 것을 알아차렸을 것입니다. 그 방식은 그렇게 작동하며 바람직하며 다른 기사에서 그 이유에 대해 논의할 것입니다.
좋아 코딩을 시작하자
Knex.js 쿼리 빌더로
Lodash 연산용
먼저 함수를 생성하고 모든 사용자를 가져올 것입니다. 연결하고 쿼리를 시작하는 방법을 알아보려면 Knex.js 문서를 참조하십시오.
const _ = require('lodash');
const lodash = require('lodash');
const database = require('/database/connection'); //DB Connection
function getAllUsersWithHobbies() {}
getAllUsersWithHobbies()
먼저 모든 사용자를 가져옵니다.
async function getAllUsersWithHobbies() {
const users = await database("user").select();
}
이제 사용자 배열이 있으므로 다음에 해야 할 일은 ID를 추출하는 것입니다.
async function getAllUsersWithHobbies() {
const users = await database("user").select(); //[ { id: 1, name: 'Ali' } ]
const usersIds = _.map(users, (el) => el.id); //[ 1 ]
}
이제 User_id가 UserIds 변수에 있는 모든 Hobbies를 찾기 위해 Hobbies에 대한 쿼리를 작성합니다.
async function getAllUsersWithHobbies() {
const users = await database("user").select();
const usersIds = _.map(users, (el) => el.id);
const Hobbies = await database('user_hobbies').select().whereIn('user_id', usersIds) //returns 2
}
다음 단계는 Lodash의 GroupBy 함수를 사용하여 User_id로 취미를 그룹화하는 것입니다. user_id를 키로 갖는 객체를 반환하고 취미의 배열은 값으로 사용자에 속합니다.
async function getAllUsersWithHobbies() {
const users = await database("user").select();
const usersIds = _.map(users, (el) => el.id);
const Hobbies = await database('user_hobbies').select().whereIn('user_id', usersIds)
const groupedHobbies = _.groupBy(Hobbies, 'user_id');
// groupedHobbies: {
// '1': [
// { id: 1, user_id: 1, hobby_name: 'First Hobby' },
// { id: 2, user_id: 1, hobby_name: 'Second Hobby' }
// ]
// }
}
마지막으로 사용자를 반복하고 user.id를 사용하여 Hobbies 개체를 가리킬 수 있습니다.
async function getAllUsersWithHobbies() {
const users = await database("user").select();
const usersIds = _.map(users, (el) => el.id);
const Hobbies = await database('user_hobbies').select().whereIn('user_id', usersIds)
const groupedHobbies = _.groupBy(Hobbies, 'user_id');
const usersEmbedded = _.map(users, (record) => {
return {
...record,
hobbies: groupedHobbies[record.id] ,
};
});
return usersEmbedded;
}
최종 출력의 예:
글쎄, 우리는 모든 사용자의 모든 취미를 검색하고 포함시키기 위해 데이터베이스를 두 번만 쳐서 원하는 정확한 결과를 얻었습니다.
이것은 단순하지만 매우 강력하여 모든 임베디드 작업을 이 방법으로 수행하고 싶을 정도입니다.
이 기사를 읽어 주셔서 감사합니다
Reference
이 문제에 관하여(SQL: Node.js를 사용한 최적의 방식으로 일대다 조인 쿼리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ali_a_koye/sql-one-to-many-join-query-in-an-optimal-way-with-nodejs-2da2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)