책을 단순히 옮겨적는것을 지양하자. 학습의 결과물이 될 수 있도록 하자.
책을 읽으며 떠오르는것, 깨달은것을 함께 적는다.
끝까지 읽어야 한다는 압박감을 버리자. 이 두꺼운 책에서 하나만 배워도 잘한것이다.
안티패턴이란
문제를 해결을 의도했지만, 또다른 문제를 발생 시키는 기법
안티패턴에 재미있는 이름을 붙여주는것은 기억하기 쉽고 은유한 이름을 짓는것은 전통이라고 한다. (그냥 드립이 아닐까..)
이 책에서는 맨티스나, 레드마인처럼 버그트래킹툴을 개발하는 상황을 예로 들었다.
무단횡단 - 쉽게 가려다 문제를 야기하는 안티패턴
원래 각 제품당 한명의 담당자를 등록할 수 있었다. 하지만 기획팀으로부터 하나의 제품에 대해 여러명의 담당자를 등록해 달라는 요청을 받았다.
목표: 다중값 속성 저장 :
기존에는 하나의 상품은 한명의 담당자만 배정받을 수 있었지만, 이제는 하나의 상품을 여러명의 담당자가 담당 할 수 있도록 변경되어야 한다.
n:1 구조에서 n:m 구조로 변경.
안티패턴 : ,로 각 담당자를 구분하여 추가한다.
안티패턴으로 인해 발생하는 문제점
- 조회
모든 FK가 하나의 컬럼에 저장되어있으면 쿼리가 어려워진다.
예를들어서 id가 A라는 담당자가 맡고있는 상품을 조회한다고 할때
select * product from accoun_id regexp 'A'; -- 대충 DBMS에 맞는 정규식으로 A를 찾는다고 가정하자.
로 검색해야 한다.
패턴 매칭을 사용하면 잘못된 결과가 반환될수도 있고 인덱스 또한 타지 않으므로 성능또한 좋지 않다.
- 검색솔루션을 담당하고 있는 담당자 정보 조회
select * from products as p
join Accounts a
on
p.account_id regexp a.account_id
where p.product_id = '검색솔루션'
정규표현식을 이용해 조인을 한다면 인덱스를 사용할 수 없어서 성능이 떨어진다.
두테이블을 모두 읽어 카데시안 곱으로 생성한 다음에 열 각각을 정규표현식으로 대입해봐야 하기 때문..
- 집계 쿼리를 사용하기에도 어렵다.
- 특정 제품에 담당자 추가하기
update Products set account_id = account_id || ',' || 56 --뒤에 덧붙인다. where product_id = 123;
- 특정 제품에 담당자 삭제하기
더 어렵다.. account_id를 전부 읽어와서 서비스 레벨에서 배열로 불러온 후...
특정 account_id를삭제 한 다음에 해당 배열을 다시 product_id로 update 해야한다.
그러다 에러가 나서 rollback이라도 하게되면... 담당자를 전부 날려버리는 대형참사....
안티패턴 사용이 합당한 경우
- 애플리케이션 단에서 쉼표로 구분된 형식의 데이터를 통째로 필요로할때.
- 목록안의 개별적인 항목에 대해서는 접근 할 필요가 없을때.
해법 : 교차테이블(조인테이블, 다대다테이블, 매핑테이블) 생성
교차테이블? FK로 두 테이블을 참조하는 테이블
- 특정 담당자가 담당하고 있는 제품 조회하기
select p.*
from Products As p JOIN Contacts As c -- 여기서 Contacts는 교차테이블
ON (p.product_id = c.product_id)
WHERE c.account_id = 34;
- 두개의 테이블을 사용하는것이 아니라 교차 테이블을 이용해서 조회하는것이 흥미롭다.
- 각 제품을 담당하고 있는 담당자 수 구하기. 반대로 하면 담당자들이 담당하고있는 제품의 수를 구할수 있다.
- 마찬가지로 이 쿼리를 사용하면
-
select accoun_id COUNT(*) AS accounts_per_product FROM Contacts GROUP BY product_id;
'Today I learned' 카테고리의 다른 글
2021 04 06 - Sql Antipatterns 계층구조 만들기 - 클로저테이블 (0) | 2021.04.06 |
---|---|
2021 04 05 - sql Antipatterns (0) | 2021.04.06 |
2021 독서목록 (2) | 2021.03.26 |
2021 03 15 - vue Router (0) | 2021.03.15 |
2021 03 12 - 화살표 함수의날. (0) | 2021.03.12 |
댓글