본문 바로가기
관리자

Programming-[Backend]

(394)
[SQLD] 4. 반정규화와 분산데이터베이스 반정규화(De-Normalization) 반정규화는 데이터베이스의 성능 향상을 위해서 데이터 중복을 허용하고 조인을 줄이는 방법이다. 반정규화 수행 시점 정규화에 따라 수행 속도가 느려지는 경우* 다량의 범위를 자주 처리해야하는 경우 특정 범위의 데이터만 자주 처리하는 경우 요약/집계 정보가 자주 요구되는 경우 반정규화는 클러스터링, 뷰, 인덱스 튜닝, 파티션 등 대안이 있는지 확인 후에 진행한다. *정규화를 수행하면 여러 테이블로 쪼개지고, 이에 따라 데이터를 조회할 때 조인을 사용해야한다. 조인은 단순한 코딩으로 치환하여 생각하면 이중 for문을 작성하는 것과 같다. 따라서 반정규화를하여 2개 테이블을 1개 테이블로 만들면 조인이 필요없게 되며 수행 속도의 향상이 있을 수 있다.** **하나의 테이블..
[SQLD] 3. 정규화 정규화(Normalization) 정규화는 데이터 중복을 제거하고, 데이터 모델의 독립성을 확보하기 위한 방법이다. 정규화를 수행하면 업무에 변화가 생겨도 데이터 모델의 변경을 최소화할 수 있다. 아래 Entity 도표처럼 만약 사원에 대한 정보와 부서에 대한 정보가 한번에 섞여있다고 가정해보자. 그럼 사원만 한 명 추가할려고해도 부서코드값과 부서명 등 부서와 관련된 정보를 null값이라도 강제로 넣어주어야한다. 이렇게 비즈니스에 필요한 엔터티와 상관없는 정보가 입력되는 것을 이상현상(Abnomaly)라고 한다. 정규화의 3단계 본래 정규화는 제1 정규화 - 제 5정규화까지 있지만 실질적으로는 제 3정규화까지만 진행한다. 정규화는 함수적 종속성을 기반으로한다. 즉 기본키(X)가 변할 때 컬럼값(Y)가 변..
[SQLD] 2. 엔터티, 속성, 관계, 식별자 엔터티(Entity) 엔터티는 업무를 추상화한 데이터 집합을 말한다. 참조1의 엔터티 도출 예제의 일부를 보자 -> 업무 시나리오 표현 ● (주)앙꼬래컨설팅에 입사하면 채용 시 개인정보를 기록한 간단한 이력서 외에도 자세한 개인정보를 기록할 수 있도록 인사기록 양식지를 배부한다. ● 입사한 모든 사원은 곧바로 부서에 배정된다. ● 인사기록 양식지에 크게 인사기본정보, 가족사항, 병역, 어학, 학력, 자격증정보, 해외경험내용, 경력 등을 기록해야 한다. ● 신입이든, 경력이든 입사한 모든 사람은 인사기록지에 위의 사항을 기록한다. ● 인사기본정보에는 한글이름, 영문이름, 주민등록번호, 집전화번호, 휴대폰번호, 전자메일, 본적주소, 현주소, 결혼여부를 기재한다. -> 엔터티 도출 (주)앙꼬래컨설팅, 가족관계..
[SQLD] 1. 데이터 모델링의 종류, 특징, ERD, 3 level schema 데이터 모델링의 이해 데이터 모델링 데이터 모델링은 현실 세계를 데이터(데이터베이스)로 표현하기 위해 추상화하는 것이다. 데이터 모델링은 고객의 비즈니스 프로세스를 이해하고 비즈니스 프로세스의 규칙을 정의한다. 정의된 비즈니스 규칙을 데이터 모델로 표현한다. 데이터 모델링의 특징 추상화(Abstraction) : 공통적인 특징을 찾고 간략하게 표현한다 단순화(Simplification) : 누구나 이해할 수 있게 표현한다 명확성(Clarity) : 한 가지의 의미를 갖고, 명확하게 해석할 수 있어야한다 데이터 모델링 단계 1. 개념적 모델링(Conceptual Data Modeling) - 계층형, 네트워크형 등의 모델 방식과 관계없이 업무 측면에서 모델링하며, 기술적 용어는 지양한다 - 엔터티와 속성을..
[TIL] 서브쿼리 - 여집합, 서브쿼리의 연결 고리 찾아서 해결 상황 여러 컬럼 중 한 컬럼의 특정값만 갖는 데이터를 구하고 싶은 상황이다. 예를 들어 아래 그림에서 code별로 address가 있는데, address가 150301이 없는 코드만 찾고 싶다면 어떻게 해야할까? 해결 방법 여집합 논리로 생각한다. 그리고 서브쿼리를 in절에 넣어서 해결한다. select distinct b.code from apple a inner join banana b on a.banana_id=b.id inner join cherry c on b.cherry_id = c.id where 1 = 1 and b.code not in ( select b.id from apple a inner join banana b on a.banana_id=b.id inner join cherry c..
[TIL] GroupBy에서는 제외하여 그루핑하되, 다른 기능에 활용하는 것은 불가 상황 재고를 표시해주는 리스트에서 id, code는 같은데 유통기한이 다른 항목이 있다면 유통기한은 무시하고 groupBy를 하는 요청을 받았다. 이때 재고 id 2, 3에 대해서 groupBy를 하고 Case When 절을 사용하여 유통기한이 여러 개일때는 null로 표시하면 문제가 발생하지 않는다. 그런데, 만약 리스트에 있는 정보를 바탕으로 다른 기능에 활용해야한다면 이때는 문제가 생긴다. 왜냐하면 재고의 유통기한이 명확히 정해져있는데, null로 표시하여 클라이언트에서 유통기한에 대한 정보를 받을 수 없다면 각 재고들의 정보를 정확하게 활용하는 것이 불가능하기 때문이다. 예를 들어 리스트 No 1의 항목에 대해 총 재고 수량을 구할려고 재고 테이블에 접근하면, 유통기한이 null인 요청을 할 수밖..
[TIL] groupBy 제거 필요 시 집계함수 활용, XOR 조건문 사용하기 1. groupBy 제거 필요 시 집계함수 활용 상황 querydsl에서 CaseBuilder를 사용하여 select 절을 구현하는 부분에서, groupBy를 하고 싶지 않은데 then절에 포함되어 groupBy를 지정해주어야만 했다. new CaseBuilder().when(ordersEntity.id.countDistinct().eq(1L)) .then(ordersEntity.id) .otherwise(0L).as("orderId") //중략... .groupBy( ... ordersEntity.id ) ordersEntity의 개수가 1개일때만 then절의 ordersEntity.id를 뽑아오는데, 그럼 select절에 ordersEntity.id가 있는 셈이므로 groupBy에 작성해주어야만 한다..
Redis 개념, Local Memory 대신 사용 이유, 설치(CLI, GUI) 1. Redis란? Redis는 리눅스 기반의 key-value 기반 메모리 서버이다. 비관계형 데이터베이스(NoSQL)기반으로 구성된다. 주로 잦은 접근이 필요한 데이터를 메모리에 저장하여 통신 속도를 높이는데 사용한다. 예컨대 웹 서비스에서 모든 사용자의 요청에 대해 사용자의 접근 권한을 확인한다. 이때 매번 데이터베이스에 연결하여 권한 정보를 가져오는 것은 비용이 매우 크고 느린 작업이므로 Redis에 접근하면 미리 Redis에 저장해둔 정보를 통해 빠르게 정보를 확인하고 응답할 수 있다. source : 유튜브 영상 - Redis Labs and SQL Server 또한 주요 특징으로 Single thread로 작동한다는 특징이 있다. 따라서 어떤 요청이 redis에서 수행되고 있다면 다른 요청은..