Tips/Database, ORM 3

JOIN 조건에 OR를 써야 한다면

결론부터 이야기하면, ⚠️ 어떤 테이블을 JOIN할 때 ON의 조건으로 두개의 컬럼을 OR로 연결하면 안된다. 예를 들어 t1, t2 두개의 테이블이 있다. c1 컬럼은 둘다 primary key이고, t2.c2에는 인덱스가 걸려 있다. create table Test.t1 ( c1 varchar(60) not null primary key, c2 varchar(60) null ); create table Test.t2 ( c1 varchar(60) not null primary key, c2 varchar(60) null ); create index idx_t2_c2 on Test.t2 (c2); 이 두 테이블을 조인해서 조회를 하는데 조건을 다음처럼 걸고 싶은 경우가 있다. SELECT * FROM ..

Tips/Database, ORM 2021.10.09

[MySQL] EXPLAIN을 이용한 쿼리/테이블 최적화

💡 이 글은 MySQL 공식문서를 읽고 정리한 글입니다. SQL에 EXPLAIN이라는 명령문이 있다. DESCRIBE와 비슷한 기능을 가지고 있는데, 일반적으로 DESCRIBE는 테이블 구조에 대한 정보를 보고자 할 때 사용하고 EXPLAIN은 쿼리 수행 계획을 살펴보는데 사용된다. 즉, 쿼리가 어떻게 실행될지 예측한다. MySQL에서는 DESC와 함께 이 셋을 완전히 동일한 명령어로 취급한다. 따라서 문서에 있는 3개 명령어는 그냥 동일한 것이라고 보면 된다. 문법은 다음과 같다. {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {explainable_stmt | FOR CON..

Tips/Database, ORM 2021.10.09

[TypeORM] Embedded Entity의 Column 이름 지정하기

TypeORM에는 Embedded Entity라는 개념이 있다. 여러 개의 엔티티에서 중복되는 컬럼들이 있을 때 이를 묶어서 별도의 엔티티(Embedded Entity)로 뽑아 내고, 뽑아낸 엔티티를 사용하고자 하는 엔티티에서 컬럼으로 선언하면 Embedded Entity에 선언된 컬럼들이 쭉 포함된다. 모두싸인 앱에는 User테이블과 InactiveUser라는 테이블이 있고, 두 테이블에는 모두 surveyXXXX 라는 필드들이 있다. 설문조사한 내용을 기록한 것인데, Inactive 상태로 바뀔 때 User 테이블에서 삭제하고 InactiveUser 테이블로 데이터를 복사한다. 이렇게 중복된 컬럼들을 Survey라는 Embedded Entity로 분리했다. Survey.ts export class S..

Tips/Database, ORM 2020.05.12