일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- @Component
- 파이썬
- 알고리즘
- spring boot
- Spring
- TypeORM
- nestJS
- 프로그래머스
- 카카오 알고리즘
- 카카오
- thymeleaf
- C언어
- nestjs typeorm
- Nodejs
- 카카오 코테
- python
- 코테
- 구조체배열
- OpenCV
- C++
- 스프링
- AWS
- 해시
- @Autowired
- git
- 컴포넌트스캔
- 가상면접사례로배우는대규모시스템설계기초
- 시스템호출
- nestjs auth
- 코딩테스트
- Today
- Total
공부 기록장 💻
[Backend/Database] 데이터베이스 모델링, RDB/NoSQL Modeling, MySQL 실습 본문
[Backend/Database] 데이터베이스 모델링, RDB/NoSQL Modeling, MySQL 실습
dream_for 2021. 8. 13. 00:32스터디 주차 별 목표 >
스터디 주차 별 목표
1주차 : Database의 종류 및 특징 + 쿼리문 이해 ( 8 / 4 ~ 8 / 11 )
2주차 : 각 Database의 모델링 방법 및 쿼리 작성법 스터디 및 실습 ( 8 / 11 ~ 8 / 18 )
3주차 : 배포 방법 스터디 및 실습 ( 8 / 18 ~ 8 / 25 )
4주차 : Django Rest Framework 스터디 ( 8 / 25 ~ 9 / 1 )
2주차 스터디 키워드
- Database Modeling
- RDB Modeling
- NoSQL Modeling
2주차 스터디 질문리스트
질문1 : Database 모델링이란 무엇일까요?
질문2 : RDB와 NoSQL의 모델링 방법 차이를 설명해주세요.
2주차 실습
RDB를 하나 설치한 다음 무쓸모톤에서 설계한 Database 스키마를 만들고 CRUD를 해보세요.
(포스팅에 사진 첨부) - MySQL 사용을 권장해드립니다.
2주차 목표
시간이 촉박한 해커톤에서 빠르고 정확한 모델링을 위한 공부!
1. Database 모델링이란 무엇일까요?
데이터베이스 모델링이란, 현실 세계의 업무적인 프로세스와 주어지는 개념들로부터
컴퓨터의 세계로 데이터베이스화하는 과정이며, 이를 논리적인 데이터 모델을 구성하는 작업이다.
논리적인 데이터 모델을 구성하기 위해서는, 데이터베이스의 골격을 이해하고 이를 바탕으로 모델의 기능과 성능적인 측면에서 효율적으로 모델을 설계해야 한다.
우선, 데이터베이스 모델링에 대해 알아보기 전에 먼저 데이터베이스의 생명 주기를 간단히 살펴 보자.
데이터베이스 생명주기/프로세스
1. 요구사항 수집 및 분석
- 데이터베이스로 적용될 실세계의 업무들에 대한 사용자의 요구를 이해하고, 제약 조건을 분석하는 단계
2. 설계
- 분석한 요구 사항들을 기반으로 데이터베이스의 구조를 개념적, 논리적, 물리적으로 명세하여 해당 DBMS를 통해 구현하는 단계
3. 구현
- 해당 DBMS에 데이터베이스를 정의하고, 이를 운영할 수 있도록 실제 응용 프로그램을 구현하는 단계
4. 운영
- 실제 데이터베이스 시스템을 가동하여, 데이터베이스가 지속적으로 조작될 수 있도록 하는 단계
5. 감시 및 개선
- 데이터베이스 시스템을 운영하는 과정에서 발생하는 문제점과 개선 사항들을 다시 분석하여 변화된 환경에 대처하고 시스템의 성능을 개선하는 단계
데이터베이스 모델링 단계
데이터베이스 생명 주기의 '설계' 단계에서 실제 데이터베이스 모델링 과정이 이루어진다.
3가지 데이터 모델의 종류 (Types of Data Modes)
1. Conceptual Data Model: This Data Model defines WHAT the system contains. This model is typically created by Business stakeholders and Data Architects. The purpose is to organize, scope and define business concepts and rules.
2. Logical Data Model: Defines HOW the system should be implemented regardless of the DBMS. This model is typically created by Data Architects and Business Analysts. The purpose is to developed technical map of rules and data structures.
3. Physical Data Model: This Data Model describes HOW the system will be implemented using a specific DBMS system. This model is typically created by DBA and developers. The purpose is actual implementation of the database.
여러가지 DB 중에서도, 관계형 데이터베이스인 RDB를 중심으로, DB 모델링이 어떻게 이루어지는지 살펴보자.
1. 개념적 모델링 (Conceptual Data Model)
개념적 모델링은 수집하고 분석한 요구사항을 토대로, 업무의 핵심적인 개념을 구분하고 전체적인 뼈대를 만드는 과정이다.
핵심 개체(Entity)들을 추출하고, 개체들 간의 관계(Relationship)를 정의하여 이를 E-R Diagram(ERD, ER다이어그램)으로 작성하는 과정까지를 개념적 모델링이라고 한다.
E-R 다이어그램을 통해 다음과 같이 데이터 간의 관계를 가시적으로 표현하여 나타낸다.
E-R 다이어그램에서 중요한 개체(entity) 간의 관계(relationship) 에 대해 짚고 넘어가보자!
ERD의 기본 요소를 먼저 살펴보자.
1. Entity(개체)
- 시스템화 하고자 하는 사건 또는 사물
- ex) User(사용자), Item(상품), Comment(댓글)
2. Attribute
- 엔티티, 관계성의 성질을 나타내는 더이상 쪼갤 수 없는 정보의 단위
- ex) User 테이블의 column - userID, userPW, nickname, profileImg
3. Relationship
- 엔티티, 속성 간의 연관성/관계
- 관계성: 1:1(one-to-one), 1:N(one-to-many), N:M(many-to-many)
Relationship (데이터 모델의 개체와 관계)
1. One-to-many relationships (1:N 대응 관계)
2. One-to-one relationships (1:1 대응 관계)
3. Many-to-many relationships (N:M 대응 관계)
개념적 모델링 과정을 마친 후, 사용할 구체적인 DBMS를 선택하게 된다.
2. 논리적 모델링 (Logical Data Model)
논리적 모델링은 개념적 모델링에서 만든 E-R 다이어그램을 사용하려는 DBMS에 맞게 사상(Mapping)하여 실제 데이터베이스로 구현하기 위한 관계 스키마 모델을 작성하는 과정이다.
논리적 모델링을 하는 과정에는 상세속성 추출, 정규화 수행, 데이터 표준화 수행이 있다.
3. 물리적 모델링 (Physical Data Model)
마지막으로, 물리적 모델링은 작성된 모델을 실제 컴퓨터의 저장 장치에 저장하기 위한 물리적 구조를 정의하고 구현하는 과정이다.
데이터 모델링의 종류
1. Hierarchial Data modeling
2. Relational Data Modeling
3. Entity-relatioonship (ER) Data Modeling
4. Object-oriented Data Modeling
5. Dimensional Data Modeling
데이터 모델링의 특징과 장점
[참고자료]
https://bitnine.tistory.com/446
https://mangkyu.tistory.com/27
https://www.guru99.com/data-modelling-conceptual-logical.html
https://www.credera.com/insights/data-modeling-explained-in-10-minutes-or-less
https://www.lucidchart.com/pages/database-diagram/database-models
https://www.ibm.com/cloud/learn/data-modeling
https://sqldbm.com/Home/
2. RDB와 NoSQL의 모델링 방법 차이를 설명해주세요.
RDB Modelnig
위에서 살펴본 것과 같이, RDB 모델링은 데이터 모델의 개체 간의 '관계'를 중심으로 모델링 과정이 이루어진다.
RDB 모델링에서는 관계를 나타내기 위해서 외래 키(foreign key)를 사용한다.
(아래 실습 과정에서 외래 키에 대해 자세히 살펴보자.)
NoSQL Modeling
관계형인 RDB 모델링과 다르게, NoSQL 모델링은 테이블 간의 관계를 정의하지 않는다.
NoSQL은 데이터 구조에 따라 여러 가지의 저장 방식이 있다.
어떠한 저장 방식으로 NoSQL DB 모델링이 이루어지는지 간단히 짚고 넘어가보자!
Key-Value Store
가장 먼저 고유한 Key에 하나의 Value를 가지고 있는 형태이다.
put(key, value) 형식의 명령어로 데이터를 입력하고, get(key) 를 통해 원하는 데이터를 출력한다.
(데이터가 Key와 Value의 쌍으로 저장되며, 값으로는 이미지나 비디오를 비롯한 어떠한 형태의 데이터를 담을 수도 있다.)
하나의 키에 여러개의 Column을 지정하여, Column-Value의 묶음 단위로 데이터를 저장하는 Column Family Store 방식도 존재한다.
데이터를 저장하는 방식이 Column-Family 방식과 동일하지만,
데이터가 내부적으로 Key를 기준으로 정렬(sorting)되어 저장하는 기능을 갖고 저장 방식인 Ordered Key/Value Store 도 존재한다.
이는 데이터를 정렬(order by)하는 기능을 제공하고 있지 않은 NoSQL의 성능을 보다 향상시킨다는 점에서 장점이 된다.
Documnet Key/Value Store
Key에 해당하는 Value 필드의 데이터 타입이 Dcoument라는 구조화된 데이터 타입(JSON, XML 파일 등)을 사용하는 것으로 특징을 갖는다.
이를 통해 복잡한 게층 구조 표현을 가느하게 한다.
[참고자료]
https://bitnine.tistory.com/446
https://bcho.tistory.com/665
https://cyberx.tistory.com/166
https://cyberx.tistory.com/166
MySQL 실습
MySQL 실습을 시작하기 전,
이전의 Django 프로젝트에서 사용하던 필드들의 데이터 타입이 MySQL에서는 유형이 조금 다른 것 같아서
MySQL의 자료형을 조금 공부해 보았다. (아래 사진 첨부!)
MySQL 데이터 타입
본격 실습!
멋사 자체 해커톤에서 진행했던 찐품명품 사이트의 DB UML 을 바탕으로,
MySQL을 활용하여 간단하게 DB 모델링을 한 후 CRUD 실습을 해보자!
우선 찐품명품의 UML은 다음과 같다.
총 3개의 Class로 이루어져 있다: Item(상품), Comment(댓글), User(사용자)
Django 에서 코드로 구현된 실제 모델 클래스들은 다음과 같다.
# Item 모델
class Item(models.Model):
title = models.CharField(max_length=50, default='')
author = models.ForeignKey('account.User', on_delete=models.CASCADE)
pub_date = models.DateTimeField()
body = models.TextField(default='')
image = models.ImageField( blank=True, null=True)
value = models.IntegerField(default=0)
clickCount = models.IntegerField(default=0)
# Comment 모델
class Comment(models.Model):
content = models.TextField(default='')
writer = models.CharField(max_length=50, default='')
itemForeign = models.ForeignKey(Item, on_delete=models.CASCADE, null=True)
# User 모델
class User(AbstractUser):
nickname = models.CharField(max_length=30, default='')
profileImg = models.ImageField(upload_to="account/", blank=True, null=True)
이를 바탕으로, MySQL 쿼리문을 통해 데이터베이스, 그리고 각 모델 클래스에 대한 테이블을 생성하고,
필드들까지 추가해보자.
데이터베이스와 테이블, 필드 생성
장고에서 사용한 필드의 데이터 타입들, 그리고 MySQL에서 사용되는 데이터 타입은 동일하지 않기 때문에
필드를 비롯해 테이블명들도 조금 수정을 하여 간단히 UML로 작성해보았다.
primary key는 pk로 다른 테이블의 key값을 필요로 하는 foreign key의 경우 fk로 표현을 해보았다.
(MySQL을 이용한 데이터 모델링과 UML 작성은 올바른 작성 방법을 다시 배워서 수정해보아야 할 것 같다!)
(이후 설명에 나오지만, Item의 image는 image_path로 변경하였다.)
아래는 데이터베이스를 생성하고, 필드 리스트를 포함한 테이블을 생성하는 명령문이다.
create database <데이터베이스명>
create table <테이블명> (<필드리스트>); # <필드리스트> : 필드명 자료형 [제약사항]
jjinPumDataBase 라는 이름의 데이터베이스를 생성하였다.
그리고 Users, Item, Comments의 테이블을 만들고, 각 데이터에 맞는 데이터 타입을 지정하였다.
create database jjinPumDataBase;
use jjinPumDataBase;
create table Users(
userID VARCHAR(30) not null,
userPW varchar(30) not null,
nickname VARCHAR(30),
profileImg LONGBLOB,
constraint pk_Users primary key(userID) # primary key
);
create table Item(
title VARCHAR(50) not null,
author VARCHAR(30) not null,
pub_date DATETIME not null,
body LONGTEXT not null,
image LONGBLOB not null, # image_path 로 변경
item_value INT default '0' not null,
clickCount INT default '0' not null,
constraint pk_Item primary key(title), # primary key
constraint fk_Item foreign key(author) references Users(userID) # foreign key );
create table Comments(
content LONGTEXT not null,
writer VARCHAR(50) not null,
itemForeign VARCHAR(50) not null,
constraint fk_Comment foreign key(itemForeign) references Item(title) # foreign key
);
완료!
하나의 데이터베이스, 그리고 그 안에 3개의 테이블이 생성된 화면은 다음과 같다.
네비게이터 바를 통해 스키마를 자세히 살펴보면, 다음과 같다.
columns(필드)들, 그리고 indexes 부분의 primary key와 foreign key까지 잘 나타났음을 확인할 수 있다.
CRUD 실습
직접 MySQL 쿼리문을 통해 생성한 데이터베이스 테이블에 레코드를 생성하여 읽고, 수정하고, 삭제하는 CRUD를 실습해보자!
기본적인 SQL 문법들도 다시 복습해보자.
1. CREATE
테이블에 새 레코드를 추가한다.
레코드를 추가하고자 하는 테이블과, 추가하려는 필드, 그리고 실제 값들을 insert문을 통해 구현한다.
insert into <테이블명> (<필드리스트>) values (<값리스트>);
1. 필드 리스트: 삽입할 레코드의 각 값들에 매칭되는 필드들
- 테이블 생성시 지정한 필드 순서와 일치하지 않아도 된다.
- not null 로 지정하지 않은 필드에는 자동적으로 null 값이 저장된다.
2. 값리스트: <필드리스트> 항목과 순서에 맞춰진 삽입될 레코드의 값들
- <필드리스트> 가 전체 생략된 경우, <값리스트>에는 테이블 생성시 나열한 필드 순서대로 나열하면 된다.
위에 잠깐 언급이 되었던 부분인데,
Item 테이블의 image 필드를 image_path로 변경하였다.
추후, 장고 또는 자바와 DB를 연동하여 사용할 것이기 때문에,
이미지 이진 데이터 자체보다는 image_path를 넣는 것이 적절한 방법이지 않을까 판단하였다.
변경 후, Item 테이블에 다음과 같이 모든 values 값들을 삽입해 보았다.
2. READ
이번엔 테이블로부터 데이터를 읽어보자.
3. UPDATE
테이블에 저장한 레코드의 데이터 값을 수정해보자.
update <테이블명> set <수정내용> where <조건>;
- set <수정내역>: 각 필드의 값을 수정하는 산술식 (새로운 데이터를 대입하는 식)
- where <조건>: 수정 대상이 되는 레코드에 대한 조건식을 기술한다. (where 조건이 없는 경우, 전체 레코드에 대해 수행한다.)
위는 User 테이블에서 userID가 "yebin"인 레코드의 nickname 필드와 userPW 필드를 수정하는 예시이다.
수정을 하고 난 후에 테이블을 읽어온 결과, 수정 내역이 적용되어 바뀐 "yebin" 의 레코드를 확인할 수 있다.
4. DELETE
테이블에 삽입된 레코드를 삭제해보자.
delete from <테이블명> where <조건>;
- where <조건> : 삭제 대상이 되는 레코드에 대한 조건을 기술한다. where 부분이 생략되는 경우 모든 레코드를 삭제한다.
Users 테이블에서 userID가 "yebin"인 레코드를 삭제해 보았다.
후에 해당 테이블을 확인해보니, "yebin"에 대한 레코드가 삭제된 것을 확인할 수 있다.
[참고자료]
https://www.youtube.com/watch?v=A0litQJtBFU&list=PLV1ll5ct6GtwAXWNsTwU6VIJF775-WASU&index=36
https://m.blog.naver.com/bjh7007/221829548634
https://www.youtube.com/watch?v=A0litQJtBFU&list=PLV1ll5ct6GtwAXWNsTwU6VIJF775-WASU&index=36
http://www.incodom.kr/DB_-_%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%83%80%EC%9E%85/MYSQL
https://salix97.tistory.com/181
http://tcpschool.com/mysql/mysql_constraint_default
간단한 2주차 스터디 소감과 3주차 공부를 시작하기 전!
장고 프로젝트 하면서 간단한 DB 모델링과 UML 작성 외에는
데이터베이스를 다루어본 경험이 없기 때문에
모델링에 대한 개념도 많이 부족한 것 같고,
MySQL 실습이 많이 부족하다고 생각한다!
우선은 스터디 진행하면서 완성도 있게 끝내지 못한 부분에 대해선 차차 내용을 보충하여 더 추가할 예정이다.
- 이론: RDB, NoSQL 모델링 / 두 모델링의 차이점, 모델링의 중요성
- 실습: SQL 다루면서 발생했던 오류들, 데이터 타입, 외래키 사용과 안잔성 문제 등
MySQL 쿼리 문법들을 더 살펴보고, CRUD 실습도 제대로 해보아야 겠다!
이후에 방학 때 DB를 연동하지 못해 못다 끝낸 자바 프로젝트를 MySQL과 연동을 해 볼 것이다.
'# Tech Studies > Web' 카테고리의 다른 글
[Web/Backend/Auth] JWT란 무엇인가? (0) | 2022.08.23 |
---|---|
[Web Data Format] XML, JSON 포맷 파일이란? (0) | 2021.11.27 |
[Backend/Web Server/Django Deploy] 웹 서버와 WAS, Django 배포 (0) | 2021.08.21 |
[Backend/Database] Database, DB Query, RDB(Relational DB)/NoSQL, ORM(Object-Relational Mapping) (3) | 2021.08.04 |
[Web/API] API란? (0) | 2021.04.20 |