본문 바로가기

TIL

23.08.02 - 역정규화, NoSQL

DB에서 한 컬럼에 여러 개의 값을 넣고 싶을 때

데이터 베이스를 설계하는 과정에서 여러 컬럼들 중 특정 컬럼에는 여러 개의 값이 필요한 경우가 많았다.

하나의 컬럼에 여러 개의 그대로 값을 넣으면 제1 정규화를 만족하지 못하여, 여러 값이 필요한 컬럼을 또 다른 테이블로 만들어 참조하는 방식으로 설계를 했고, 그 결과 테이블이 기존 설계보다 많아지는 현상이 발생했다. 그래서 이 문제를 해결할 방법을 모색하던 중 두 가지 방법을 발견했다.

1. 역정규화(denormalization)

  • 이전에 정규화된 데이터베이스에서 성능을 개선하기 위해 사용되는 전략이다. 역정규화는 일부 쓰기 성능의 손실을 감수하고 데이터를 묶거나 데이터의 복제 사본을 추가함으로써 데이터베이스의 읽기 성능을 개선하려고 시도하는 과정이다. (출처: 위키피디아)

정규화는 데이터 무결성, 효과적인 검색 등 장점이 있지만, 비용이 더 든다는 단점이 있다.

이러한 비용적인 측면을 최소화하기 위해서 정규화한 것을 다시 돌리는 것이 역정규화이다.

 

역정규화한 테이블(정규화는 하지 않은 테이블)에 우리가 원하는 값들을 컬럼에 JSON형태로 넣으면 여러 가지의 값을 넣을 수 있다.

MySQL의 JSON 형태로 값 저장한 예시

2. NoSQL(Not Only SQL)

  • Not Only SQL로 SQL만을 사용하지 않는 DBS로, RDBS를 제외한 다른 모든 DBS를 지칭한다.

스키마를 미리 정해놓고 테이블을 만드는 RDBS와 달리 형식을 지정하지 않고도 저장이 가능한 NoSQL의 특징으로 우연하고, 확장이 용이하다는 장점이 있다.

 

NoSQL의 데이터베이스 유형으로 4개가 존재한다.

  1. Key-Value
  2. Document
  3. Column
  4. Graph

내가 직면한 문제는 Document DB로 해결할 수 있다. Document DB는 단어 그대로 문서의 형태로 저장을 하는데 여기서 말하는 문서는 JSON이나 XML 같은 형식이다. 

 

아래는 MongoDB의 Airbnb Dataset의 일부를 가져왔다.

{
"_id": "10006546",
"listing_url": "https://www.airbnb.com/rooms/10006546",
"name": "Ribeira Charming Duplex",
"summary": "Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube)...",
"house_rules": "Make the house your home...",
"property_type": "House",
"calendar_last_scraped": {
    "$date": {
       "$numberLong": "1550293200000"
        }
    },
"amenities": [
    "TV",
    "Cable TV",
    "Wifi",
    "Kitchen",
    "Paid parking off premises",
    "Smoking allowed",
    "Microwave"
    ]
}

컬럼당 하나의 값을 저장할 수 도있고, "amenities" 컬럼처럼 여러 개의 값을 가지는 형태로도 저장이 가능하다.


위와 같이 내가 직면한 문제에 대하여 깊게 파고들고 어떻게 해결할지 고민하고 모색하는 과정이 나의 기술 디테일을 살리는 가장 좋은 방법인 것을 체감했다.

 

혼자 공부를 했으면 이렇게 깊게 파고들 생각을 못했을 것 같은데 팀원들과 계속 문제에 대해 얘기하다 보니 이렇게 할 수 있는 것 같다. 프로젝트를 시작한 지 3일이 됐고 내일이면 마감이지만 기회가 되고 가능하다면 지금 팀원들과 계속 작업하고 싶고, 현 팀원들과 같은 열정을 가진 분들과 함께 작업을 하고 싶다.

주위에 이런 동료를 두는 게 나를 가장 성장시키는 디딤돌이 되어준다.

'TIL' 카테고리의 다른 글

23.08.08 - 백준 11653번 문제 with Python  (1) 2023.08.09
23.08.07  (0) 2023.08.08
23.08.01 - 논리적 데이터 모델링(Relation 모델)  (0) 2023.08.01
23.07.31 - 개념적 데이터 모델링(E-R 다이어그램)  (0) 2023.07.31
23.07.26  (0) 2023.07.27