프로그래밍/서버, DBMS

[책 요약] Effective SQL - SQL 코딩의 기술 요약 (Ch1. 데이터 모델 설계)

포도알77 2021. 2. 17. 21:59
Effective SQL, SQL 코딩의 기술이라는 책을 읽고 요약한 것으로, 실제 책과 동일하지 않을 수 있음. 개인 정리용

1. 개요

1.1 SQL or SEQUEL??

 RDMBS에서 구조화된 간단한 영어 문장을 이용하여 Database에 질의를 할 수 있는 언어로 SEQUEL(Structured English QUEry Language, 시퀄)이라고 부르며, SEQUEL이라는 명칭이 이미 사용되고 있어 법적인 이유로 SQL(에스큐엘, ess-cue-el)으로 변경했다. 

 

 표준화가 늘 그렇듯, 널리 사용되는 RDBMS의 SQL들의 최소 공통 분모만을 담고 있으며, RDBMS별로 어떤식으로 구현됐는지, 혹은 세부적인 동작 방법, 리터럴은 다를 수 있다. (Ex, record 고유 키로 사용되는 정수 컬럼을 DB2, SQL Server, Oracle : IDENTITY, Access : AutoNumber, MySQL : AUTO_INCREMENT, PostgreSQL : Serial으로 사용)

 

 

1.2 널리 사용되는 DBMS

 db-engine ranking이라는 사이트를 통하여 어떤 DBMS가 많이 사용되는지 확인할 수 있다. 여기서는 RDBMS와 No-SQL DBMS 모두 포함된다.

 

 RDBMS로는 DB2, Access, SQL Server, MySQL, Oracle Database, PostgreSQL등이 있다. (초판이 17년에 나왔는데 왜 Maria DB는 없는지 현재로써는 불분명. 향후에 책에 나열되어 있다면 이 부분을 지우겠음)

 

 

2. 데이터 모델 설계

2.1 기본키의 중요성

 기본키는 원하는 로우가 단 1개라는 것을 보장. 로우마다 유일하다고 해서 DB 엔진이 항상 효율적이라는 것을 보장하진 않지만, 기본키를 명시적으로 통보함으로서 그 가능성을 높임.

 

 기본키는 "간단, 안정적이면서 NULL 아닌 유일한 값"이어야 한다. 

 1) 간단 - 단순한 값(정수>부동소수), 단일컬럼

 2) 안정적 - 값을 갱신할 필요 없는

 3) NULL 아닌

 4) 유일한 값

 

 DB별로, IDENTITY, Auto_Increment, AutoNumber, Serial 컬럼을 통하여 자동으로 증가되는 고유한 정수 값을 얻을 수 있음.

 또한 다중 컬럼 키는 인덱스 생성이나, 조인등 더 복잡하고 느려지기만 함.

2.2 중복 데이터의 제거

 정규화를 통하여 중복되는 데이터를 삭제한다. 이를 통해 데이터의 크기도 줄어들고 그로인한 DB 부하도 줄어든다. 더불어 비정상적인 삽입 갱신, 삭제 (abnormally)을 막을 수 있음.

 

 원본 데이터가 필요한 경우, 각 테이블을 합쳐서 쉽게 생성 가능하다.

2.3 반복 그룹의 제거

 반복 그룹이란, 비슷한 내용을 담기 위하여 여러개의 컬럼을 두는 것을 의미한다.

예를 들어 컬럼에 3~5개의 어트리뷰트를 저장하기 위하여, attr1, ...., attr5까지 선언하여 두는 것을 의미.

 

 "영향도(비용) 측면에서 컬럼은 비싸고 로우는 싸다"

 

 따라서 Reference key를 활용한 테이블 분리를 통하여 로우 단위로 저장한다. 이를 통해 설계가 유연해지고, 데이터 중복을 피할 수 있다.

2.4 컬럼당 하나의 특성만 저장

 주소를 예를 들어보면, 주소 전체를 저장하지 말고 세부 단위로 쪼개어 저장하는 것을 의미한다. 만약 하나로 합쳐져 저장되어 있으면 LIKE같은 구문을 통하여 불필요한 로드가 증가된다.

 

 최소 수준으로 데이터를 분할 하여 저장하고, 필요하다면 재결합하여 사용하면 된다.

2.5 계산 데이터는 저장하지 말자

 데이터를 계산하여 저장하는 방법으로 트리거등을 이용하여 저장하는데, 데이터 입력, 업데이트 등에서 전체적인 성능 하락을 가져오게 되며 일관성 유지 비용이 커진다.

 

 이 또한 필요한 경우에는 View를 이용하여 계산하면 된다. (테이블 사용 방법에 따라 결정하면 될 듯, 처음에만 입력되고 그 다음부터는 업데이트 되지 않는 경우라면, 굳이 DB에서 계산해 넣는 방식이 아니어도 됨. 즉, 지속적으로 DB에 저장된 값들이 변함에 따라 계속해서 업데이트 해주는 경우를 말하는 듯함.) 

2.6 참조 무결성과 외래키

 외래키를 생성함으로써 무결성을 보장할 수 있고, 일부 시스템에선 외래키 선언에 따른 인덱스가 자동으로 생성되어 성능 향상을 낼 수 있다. (라고 하지만 외래키 본질과 성능 향상은 관계가 없고, 명시적으로 선언해주는 것이 좋겠다.)

2.7 명확한 테이블 관계

2.8 제 3정규화도 부족할 수 있다.

 이 내용은 적절하게 테이블을 쪼개고, 어플리케이션 설계에 부합하는지 여부를 확인하라는 내용.

 

2.9 데이터 웨어하우스에 역정규화 사용

 일반적으로 데이터 베이스의 테이블은 잘 정규화되어 많이 분해되어 있으면, 버퍼에 올라갈 수 있고 이로 인해 성능이 빠르다. 또한 단일 공간에 있을 수록 데이터 갱신과 삽입도 빠르게 수행된다.

 

 반면, 읽기가 매우 빈번하고 대부분의 경우에 조인등을 통하여 여러 정보를 같이 읽는 경우에는 오히려 역정규화를 통하여 한 테이블에 모아두는 것이 효율적일 수 있다.

 이런 경우를 데이터 웨어하우스 시스템이라고 하며, 팩트테이블과 디멘전 테이블의 핵심 개념을 이해하여야 한다.

 

 

 

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사