오늘은 DDL에 대해서 배우는 시간이었다.
데이터 정의어(Data Definition Language, DDL)는 데이터베이스 내에 테이블이나 인덱스, 뷰 등의 객체를 만들거나 수정, 삭제할 때 사용하는 언어이며 CREATE, ALTER, DROP이 있다.
문자형 데이터타입
- CHAR : 고정길이 문자형 데이터타입. 지정한 길이보다 데이터 길이가 작으면 빈칸만큼 공백(Blank)이 들어감.
- VARCHAR : 가변길이 문자형 데이터타입. 데이터의 길이만큼의 메모리만 차지함.
- TEXT : VARCHAR과 달리 길이를 지정하지 않음. 컬럼의 최대 길이를 모르는 경우에 사용하기 적합함.
숫자형 데이터타입
- 정수형 : 들어갈 데이터의 크기에 따라 TINYINT부터 BIGINT중에서 선택하여 지정할 수 있음
- 실수형 : FLOAT형, DOUBLE형, DECIMAL형 중에서 선택하여 지정할 수 있음
이 외에도 날짜시간형 데이터타입, 이진형 데이터타입, 공간형 데이터타입 등이 있다.
이후에는 본격적으로 데이터 테이블을 생성하고 수정하고 삭제하는 등의 실습이 진행되었다.

CREATE로 테이블 생성하고 레코드 3건을 삽입하였다.

ALTER을 사용하여 테이블을 수정할 수 있고 ADD로 성별 컬럼을 추가하였다.
'DROP TABLE 테이블명'은 테이블을 삭제할 때 사용한다.
제약조건

제약조건을 추가하여 학생 테이블을 다시 생성하였다.
오늘은 SQL에서 데이터베이스 구조를 정의하고 설계하는 핵심 문법인 DDL에 대해 실습하며 이해도를 높일 수 있었다. 기존에는 데이터를 '조회'하는 데만 초점이 맞춰져 있었는데, 수업을 통해 테이블을 처음부터 직접 생성하고 구조를 설계하는 과정이 얼마나 중요한지 체감할 수 있었다. ALTER, DROP과 같은 명령어를 실습하면서 실제 상황에서 테이블을 어떻게 유연하게 관리할 수 있는지 알 수 있었으며, SQL 문법이 점점 복잡해지고 있지만, 지금까지의 학습 흐름을 놓치지 않으려 꾸준히 따라가고 있다.
오늘은 MySQL + Python 연결해보는 것을 짧게 해보았다. pymysql은 파이썬에서 MySQL 데이터베이스에 접속할 수 있게 해주는 라이브러리이다. 설치한 후 DB에 연결 상태 정보로부터 커서를 생성해 실행시켜보았다.
import pymysql
conn = pymysql.connect(
host='localhost', user='root', password='1234', db='my_db', charset='utf8'
)
cursor = conn.cursor()
sql_query = '''SELECT ENAME, SAL, JOB
FROM EMP;
'''
cursor.execute(sql_query)
result = cursor.fetchall()
import pandas as pd
pd.DataFrame(result)

파이썬에서 데이터프레임으로 만들고 데이터를 보면 위처럼 나오게 된다. 단순히 보는 것 외에도 SQLAlchemy 라이브러리를 설치하여 새로운 테이블 정의하고 업데이트, 삭제 등을 할 수도 있다. 단순 SQL 쿼리만 작성하는 것과 달리, 파이썬 코드 안에서 SQL 결과를 처리하고 DataFrame으로 시각화해보는 과정이 신기했다.
이후에는 데이터 모델링에 대해 기본 개념을 배우고 ERD를 직접 그려보기도 했다.
데이터 모델링(Data Modeling)은 데이터 모델을 개발하기 위한 과정으로 현실 세계의 데이터를 추상화하여 데이터 모델로 변환하는 작업이다. 데이터 모델의 종류로는
- 계층적 데이터 모델
- 네트워크 데이터 모델
- 개체-관계형 데이터 모델
- 관계형 데이터 모델
- 차원 데이터 모델
- 객체지향 데이터 모델
- 그래프 데이터 모델
등이 있다. 가장 먼저 요구사항을 분석한 후 데이터 모델링을 진행해야 한다.
<온라인 서점 데이터베이스 설계>
문제 정의:
- 현황: 도서, 주문, 리뷰 등의 데이터가 여러 개의 엑셀 파일로 분산되어 있어 데이터 중복, 오류 발생, 통계 분석의 어려움이 있다.
- 목표: 효율적인 데이터 저장 및 분석을 위해 관계형 데이터베이스를 설계하고, 이를 기반으로 주문 처리 및 사용자 리뷰 기능이 가능한 시스템 기반을 마련한다.
요구사항:
1. 고객은 여러 번 주문할 수 있고, 한 번의 주문에 여러 도서를 구매할 수 있다.
2. 각 도서는 하나의 출판사와 한 명 이상의 저자와 연결될 수 있다.
3. 도서 재고는 관리되어야 하며, 주문 시 재고 수량이 차감된다.
4. 고객은 주문한 책에 대해 리뷰를 작성할 수 있다.
5. 관리자는 도서, 저자, 출판사 정보를 관리할 수 있다.
팀원(옆자리)들과 함께 의견을 나누며 같이 모델링을 해 보았다.

큰 틀로 고객, 도시, 저자, 관리자, 출판사를 두고 필요한 엔티티와 속성들을 하나하나씩 정의해나갔다. 정의하며 다른 엔티티와의 관계도 일대일/일대다/다대일/다대다 인지 도출해보았다. 요구사항이 그리 많이 않기때문에 금방 끝날 것 같았는데 고려해야할 것이 많아서 생각보다 오래걸렸다. 그래도 모델링하는 방법을 이론으로만 이해하는 것보다 직접 그려보는 것이 확실히 이해하기 쉬웠다. 위 그림도 완전한 ERD는 아니고 다대다 엔티티 관계에서 Relationship(관계 사이의 행동)을 추가해야한다. 직접 팀원들과 의견을 나누며 모델링을 완성해보는 과정이 특히 의미 있었고, 이론보다 실습을 통해 더 많이 배운 수업이었다.
어제 데이터 모델링에 이어서 오늘은 정규화에 대해 배우는 시간이었다.
이상(Anomaly)은 관계형 데이터베이스에서 데이터 삽입, 삭제 및 수정과 관련하여 발생할 수 있는 불일치 또는 오류이다.
삽입 이상 : 데이터를 삽입할 때 발생하는 이상으로 삽입할 때 원하지 않는 불필요한 데이터를 반복해서 입력해야 하는 경우
- 삭제 이상 : 데이터를 삭제할 때 발생하는 이상으로 테이블에서 일부 레코드를 삭제하면 삭제할 필요가 없는 다른 정보도 함께 삭제되는 경우
- 수정 이상 : 데이터를 변경할 때 발생하는 이상으로 테이블의 일부 레코드의 값만 수정되어 데이터 일관성이 깨지는 경우
함수적 종속성(Functional Dependency, FD)은 관계형 데이터베이스의 릴레이션에서 속성 간의 관계이다.
- 완전 함수적 종속성 : 기본키가 아닌 속성들이 기본키에 종속이 되는 종속 관계
- 부분 함수적 종속성 : 기본키가 아닌 속성들이 기본키의 일부에 종속되는 관계
- 이행 함수적 종속성 : 세 개 이상의 속성이 연결되어 있을 때 발생하는 종속 관계
X,Y,Z라는 3개의 속성이 있을 때 X->Y, Y->Z와 같이 속성 간에 종속성이 연쇄적으로 전파되는 경우
강사님께서 연습문제를 주셔서 개념을 이해할 수 있었다.

처음에는 반납예정일을 대여일자와 마찬가지로 완전 종속성인 줄 알았는데 반납예정일이 대여일자에 +7일 이라는 규칙성이 보여서 대여일자로부터 반납예정일을 알 수 있다고 판단했기 때문에 이행 종속성으로 작성하였다.
이후에 정규화의 형식 제1정규형, 제2정규형, 제3정규형, 추가적인 정규화 형식 등 개념에 대해 배웠는데 정확히 이해가 가질 않아서 해당 부분에 대해서는 공부를 좀 더 해야할 것 같다.
반정규화(Denormalization)는 중복 데이터를 하나 이상의 테이블에 추가하는 데이터베이스 최적화 기술이다. 반정규화의 장점으로는 조인 개수를 줄일 수 있고, 이로 인해 검색 쿼리가 간단해지며 빠른 읽기 작업의 수행으로 인해 검색 성능을 높일 수 있다. 반면 반정규화의 단점으로는 중복 저장으로 인해 더 많은 스토리지가 필요하고 데이터 불일치가 발생할 수 있으며 쓰기 작업에 추가적인 비용이 소요될 수 있다.

위 구조를 보고 어떻게 반정규화를 할지 고민해보았다. 해당 구조에서는 반정규화를 아래와 같이 진행할 수 있다.
- 배송 테이블에서 고객의 정보를 찾는 빈도가 높을 경우 고객과 배송 테이블의 관계를 추가하는 관계의 반정규화를 한다.
- 주문목록 테이블에서 고객의 정보를 찾는 빈도가 높을 경우 고객과 주문 테이블의 비식별자 관계를 식별자 관계로 한다.
- 주문 테이블에서 항상 고객명을 같이 조회하는 경우, 고객 테이블의 고객명을 주문 테이블에 넣는 컬럼의 반정규화를 한다.
- 주문과 주문목록, 배송 테이블의 모든 컬럼을 고객 (최상위 테이블) 테이블에 모두 넣는 반정규화를 한다.
삽입·삭제·수정 이상이 왜 발생하는지를 실제 예제를 통해 보니 정규화가 필요한 이유가 좀 더 체감되었다. 함수적 종속성도 예제를 통해 직접 분석하면서 개념을 익힐 수 있었다. 다만 제1~제3정규형의 개념과 구분은 아직 헷갈리는 부분이 있어 복습이 더 필요하다고 느꼈다. 마지막으로 반정규화에 대해서도 배웠는데, 정규화와는 반대의 개념이라는 점은 알 수 있었고, 실무에서 자주 사용된다는 점도 인상 깊었다. 오늘 수업은 개념적으로는 어렵게 느껴졌지만 실습과 함께하며 조금씩 정리가 되어가고 있다.
오늘 특강에서는 취업 전략에 대해 실질적이고 현실적인 조언들을 들을 수 있어 매우 유익한 시간이었다. 특히 직무에 대한 정확한 이해가 선행되어야 하며, 직접 데이터를 다루며 포트폴리오를 꾸준히 제작하는 것이 강력하게 추천되었다.
지원 기업을 미리 조사하고 분류해 두는 습관이 필요하다는 점도 기억에 남으며 채용공고에 신속히 대응할 수 있도록 사전 준비의 중요성을 느낄 수 있었고, 앞으로의 준비 과정에서 실행에 옮길 수 있는 실질적인 팁들을 많이 얻을 수 있어 뜻깊었다.
오늘부터는 통계에 대해서 배워본다.
- 모집단 : 연구, 실험의 결과가 일반화된 큰 집단, 정보를 얻고자 하는 관심 대상의 전체 집합
- 표본 : 모집단 속에서 일부를 추출하여 조사한 결과로 원래 집단의 성질을 추측할 수 있는 자료
- 표본 추출 : 모집단으로부터 표본을 선택하는 행위(과정)
- 전수조사 : 대상 집단을 모두 조사하는 것으로 많은 비용과 시간이 소요됨
- 모수 : 모집단을 대표하는 값 - 모평균, 모분산, 모표준편차 등
- 표본조사 : 모집단을 대표할 수 있는 표본을 추출하여 조사하는 것
- 통계량 : 모수를 알기 위하여 구하는 표본을 대표하는 값 - 표본평균, 표준오차 등
파이썬으로 통계 코드 연습을 해 보았다.
import numpy as np
# 산술평균
data = [10, 20, 30, 40, 50]
mean_value = np.mean(data)
print(mean_value)
결과는 30.0이 나온다.
# 기하평균 : n개의 자료에 대해 관측치를 곱한 후, n제곱근으로 표현
from scipy.stats import hmean, gmean
gmean(data)
결과는 np.float64(26.051710846973528) 이다.
# 조화평균 : 각 요소의 역수의 산술평균을 구한 후 다시 역수를 취하는 형태로 표현
hmean(data)
결과는 np.float64(21.8978102189781) 이다.
백분위수는 한 분포나 점수 집합에서 특정 값과 같거나 작은 경우의 백분율을 정의하는 데 사용한다. 해당 개념도 파이썬으로 연습을 했다.
import numpy as np
scores = [65, 75, 80, 85, 95]
p25 = np.percentile(scores, 25) # Q1
p50 = np.percentile(scores, 50) # Q2, median
p75 = np.percentile(scores, 75) # Q3
p25, p50, p75
결과는 각각 (np.float64(75.0), np.float64(80.0), np.float64(85.0)) 이다.
이 외에도 최빈값 연습과 변동(산포) 연습도 하였다.
왜도(Skewness) : 분포의 비대칭성을 측정하는 지표, 데이터가 좌우 어느 방향으로 치우쳐 있는지 측정

양의 왜도(positive skewness)에서는 대부분의 데이터가 왼쪽에 집중되어 있고 오른쪽으로 꼬리가 길게 뻗어 있다. 이러한 분포에서는 일반적으로 다음과 같은 관계가 성립한다:
최빈값(Mode) < 중앙값(Median) < 평균(Mean)
즉, 극단적인 큰 값들이 평균을 오른쪽으로 끌어당기기 때문에 평균이 중앙값보다 크게 나타나고, 가장 빈번하게 발생하는 값(최빈값)은 그보다 더 작다.
반대로 음의 왜도(negative skewness)에서는 다음 관계가 성립한다:
평균(Mean) < 중앙값(Median) < 최빈값(Mode)
오늘은 통계학의 기본 개념과 파이썬을 활용한 기초 통계 분석을 배웠다. 모집단과 표본, 모수와 통계량의 차이를 이해하면서 통계의 전반적인 구조를 파악할 수 있었다. 백분위수와 사분위범위(IQR)를 계산하는 실습에서는 데이터의 분포를 정량적으로 이해하는 방법을 배웠고, 왜도(skewness)를 통해 평균, 중앙값, 최빈값 사이의 관계도 흥미롭게 다가왔다. 단순히 개념을 암기하는 것이 아니라 데이터를 코드로 직접 다뤄보며 배우니 이해가기에 도움이 되었다. 아직 통계는 낯설지만 흥미롭게 접근하려고 노력하고 있다. 😎
블로그 잘 보고 갑니다
정리 잘하시네요 덕분에 참고가 되었습니다