-
사용 스택 : Python, MySQL
-
개발 기간 : 2021년 6월 4일 ~ 6월 9일
-
시연 영상 : https://youtu.be/e4CGzLti2Os
-
프로젝트 내용 요약
- 영화 관련 정보를 제공하는 IMDB 사이트의 tsv 파일 데이터들 간의 관계를 분석
- 나만의 관계형 DB 모델 설계 후 테이블 생성
- 1억 여개의 레코드 삽입 및 인덱싱 적용
- Python으로 DB에 접근하여 간단한 쿼리 프로그램 작성
-
제작 문서
-
어려웠던 점 / 깨달은 점
- 설계를 바닥부터 스스로 해야 한다는 게 어려웠는데, 주어진 데이터들의 속성 및 관계를 분석하고, Entity와 Entity 사이의 관계의 종류 및 Table과 Table 사이의 관계의 종류를 나열하여, 상황에 맞게 적절한 관계를 선택함으로써 설계를 완성할 수 있었습니다.
- 테이블 간의 관계를 한 눈에 알아볼 수 있게 Lucid Chart 툴을 통해 Diagram으로 시각화하니, 좀 더 효율적으로 설계가 진행될 수 있었습니다.
- Python으로 여러 개의 레코드를 삽입할 때는, execute()보다는 executeMany()가 훨씬 삽입 성능이 빠르다는 것을 알았습니다.
- Null, 자료형, 구분자, 오염된 Data 등 불완전한 Data들을 Insert하는 데에 여러 가지 오류 및 장애가 발생했고, Exception 발생 시 Commit 처리를 함으로써 디버깅할 수 있었습니다.
- 모든 레코드를 다 삽입한 뒤에 FK를 ADD할 때 FK Integrity Exception이 발생하는 이유가, 'FK가 적용된 컬럼의 값'들 중에 'FK가 참조하는 컬럼에 없는 값'이 포함되어 있기 때문임을 알았습니다. 이는 정규화되지 않은 Raw 데이터를 DB 내에 정규화시키다 보니 발생하는 문제입니다.
- Python에서 DB에 Insert하는 중에는 DB의 Connection 자원 전체를 선점하고 있기 때문에, 도중에 Mysql Workbench에서 날린 쿼리는 Python의 Insert 작업이 끝날 때까지 끝없이 지연된다는 것을 알았습니다.
- Python에서 DB에 대한 작업을 수행 중이지 않더라도 Connection을 Close하지 않으면 다른 클라이언트에게 Connection을 할당해줄 수 없다는 것을 알았습니다. 특히, 비록 소스 코드의 마지막 부분에 Close 명령어를 배치해놓더라도, 소스 코드의 중반부에서 Exception이 발생하면 Close 명령어가 실행되지 않기 때문에, 프로그램은 종료되어도 Connection은 Close되지 않은 상태가 유지되어, DB에 대한 접속을 영구적으로 마비시키는 문제가 발생함을 알게 되었습니다. 이를 위한 해결책으로 Exception의 Catch문에 Close 명령어를 삽입해야 한다는 것을 깨달았습니다.
-
느낀 점
- 예전에는 이론적 배경 없이 MySql 설계 및 구현을 비효율적으로 무식하게 했는데 이번 기회를 통해 기초적인 설계 방법을 배워 복잡한 테이블 관계도 구현할 수 있게 되었고 Index를 통한 성능 개선 방법까지 익힐 수 있어서, RDB에 대한 자신감이 좀 더 생겼습니다.
- 1억 개 이상의 데이터가 있는 DB에서 복잡한 쿼리를 작성했을 때, 인덱스를 적용해도 성능이 느린 경우가 발생하는데, 이 경우 더 나은 쿼리를 작성하거나 더 효율적인 테이블 설계를 해야할 것 같습니다.
-
Notifications
You must be signed in to change notification settings - Fork 0
JasonYoo1995/imdb_DB_Design_Implementation
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published