본문 바로가기

Database

데이터베이스

-데이터베이스란

: 데이터를 보존하는 창고를 의미한다.

: 데이터베이스란 특정한 주제로 데이터를 모아둔 것을 의미한다.

-데이터베이스 관리시스템 ( DBMS)

: 데이터를 관리하고 조작하는 application,

: 데이터를 검색,추가,갱신,보안관리 ,동시접근, 크기를 관리한다.

- NoSQL

-SQL만을 사용하지 않는 DBMS를 의미한다.

-관계형DB를 포함한 여러 DB를 사용한다.

-Not only SQL이라는 뜻으로, SQL외에도 다양한 유형의 데이터베이스를 사용하는 것을 의미한다. ( 관계형 DB도 사용한다 )

  • 대부분 클러스터에서 실행할 목적으로 만들어졌기 떄문에 관계형 모델을 사용하지 않는다.
  • 대부분 오픈소스이다.
  • ODBMS는 NoSQL이 아니다.
  • -스키마 없이 동작하고 구조에 대한 정의를 변경할 필요없이 DB 레코드에 자유롭게 필드를 추가할 수 있다.

-데이터의 일관성이 보장되지 않는다.

특징

1) 일관성과 확장성 사이의 trade-off

: 데이터베이스의 일관성이 절대적인 요소가 아님을 주장하는 사람들이 만들었다.

: 다수가 동시에 읽고 쓰는 상황애서의 성능 향상을 위함

: 분산 환경에서 노드들이 잘 동작하고 있을 떄에도 시스템의 일부가 고장나면 데이터베이스를 사용할 수 없게되는 문제를 해결

2) 분산저장

: 데이터와 트래픽이 증가하며 발생하는 문제점을 해결하기위해 장비 설정을 변경해야한다.

: 장비 설정의 방법은 두가지로, 수직적 확장과 수평적 확장으로 나뉘어진다.

: 수직적 확장

-장비의 성능을 키운다.

-비용문제가 발생한다.

:수평적 확장

-장비의 수를 늘린다

: 관계형 DB는 클러스터 상에서 비 효율적으로 동작하는 구조를 가지고있어서, 디스크 서브 시스템에서 문제가 생길경우 DB를 사용할 수 없게 된다.

:샤딩

- 샤드키를 기준으로 하나의 테이블을 수평분할하여 서로 다른 클러스터에 분산 저장하고 질의할 수 있는 기법이다.

샤딩으로 관계형 데이터베이스에서도 부하를 분산할 수 있지만 어플리케이션 레벨에서 모든 샤딩을 제어해야 한다.

여러 샤드에 걸치는 쿼리나 참조, 정합성, 트랜잭션 일관성의 제어에 문제가 발생한다.

: 분산저장을 지원하는 noSQL 데이터베이스는 집합-저장 모델을 사용하여 샤딩 문제를 해결한다.

연관된 데이터들이 함꼐 분산되므로 관계형 모델처럼 복잡한 제어가 필요하지 않게 된다.

3) 데이터 일치

RDBMS에서 관계형 튜플 안의 값은 단순해야한다.

중첩된 레코드나 리스트 등 다른 구조를 포함할 수 없다.

메모리 내 데이터 구조에서는 이런 제약이 없기 떄문에 훨씬 복잡한 구조를 사용한다 ( List, dictionary, 중첩된 객체 구조 ) 그래서 복잡한 메모리 내 데이터 구조를 데이터베이스에 저장하려면 먼저 관계형 표현으로 변환해야한다.

:ORM프레임워크를 통해 해결할 수 있다. 그럼에도 관계형 모델과 메모리 내 데이터 구조사이의 데이터 불일치는 발생한다. ( Impedance mismatch )

:NoSQL은 메모리 내의 데이터 구조에 상관하지 않고 하나의 Aggregation으로 취급하여 저장한다. 그래서 ORM프레임 워크가 불필요하다.

4) schema-less

NoSQL 데이터베이스의 공통적인 특징은 스키마 없이 동작한다는 점이다.

데이터 구조를 미리 정의할 필요가 없다.

시간이 지나더라도 언제든 변경할 수 있어서 비형식적인 데이터를 저장하는데에 용이하다

DB가 스키마를 직접관리하지 않을 뿐이지, 데이터타입에 따른 스키마는 존재한다.

단일 값에 대한 데이터 타입에서 불일치가 발생할 수 있다.

암묵적인 스키마를 무시하고 다른 이름으로 저장하면 같은 이름의 여러개의 스키마가 생성될 수 있다 ( 예 : quantity, QUANTITY, qty..등)

따라서 주의를 기울여 저장해야한다

-종류

: 종류

-Redis, Cassandra, HBase, Firebase의 Cloud Firestore, MongoDB

:관계형 데이터베이스

-컬럼과 레코드로 구성된 여러개의 테이블로 관계를 맺게한 데이터 베이스

-트랜잭션 처리가 용이하다(start transaction )

-동시실행을 제어한다 (lock)

1) key-value 모델

-키와 값을 하나의 묶음으로 저장하는 DB.

-데이터 집합 안에서 중복되지 않는다.

- 키가 유일한 값을 갖기 떄문에 특정 키에 해당하는 값을 바로 추출할 수 있다.

-구조가 단순하기 떄문에 값을 추출할 때 소모되는 시간이 단출된다.

-수평적 확장이 용이하다.

-간단한 API만을 제공하기 떄문에 쉽게 배울 수 있다.

-대표적으로 Memcached, Riak, Redis, Amazon DamoRd, LevelDB등이 있다.

2) column-family 모델

-레코드와 구성된 컬럼으로 구성된 테이블에 데이터를 컬럼단위로 묶어서 장하는 DB

-키에서 필드를 결정한다.

-연관된 데이터는 column-family안에 속해있고, 각자의 이름을 가진다.

-컬럼단위로 집계하고 추출하는데에 적합하다.

-RDB에서는 번호, 이름, 전화번호 등의 정보를 제공할 떄 컬럼지향DB는 필요한 컬럼의 데이터만 추출한다.

-클러스터링이 쉽게 이루어진다

-TimeStamp가 존재하여 값이 수정된 히스토리를 알 수 있다.

-어떤 형태의 데이터라도 저장될 수 있다.

Blob단위의 쿼리가 불가능고 Row와 Column의 초기 디자인이 중요하다.

새로운 필드를 만드는데에 비용이 크게 든다.

-HBase, Cassandra, Hypertable등이 이 구조를 가진다.

3) document 모델

-키와 도큐먼트를 하나의 값으로 저장하는 DB를 으미한다.

-임의의 구조로 설정 된 데이터를 저장할 수 있다.

-도큐먼트마다 데이터구조가 같지 않아도 된다. 틀없이 자유롭게 저장 가능하다.

-객체를 도큐먼트의 형태로 바로 저장 가능하기 때문에 객체-관계 매핑이 필요하지 않다.

-MongoDB, CouchDB, MarkLogic 등이 있다.

4) 그래프 모델

-관계형 모델에 가깝다.

-데이터를 관계화 함꼐 표현하기 위해 디자인 된 모델이다

-연속적인 노트,관계,특성의 형태로 저장된다.

-개체와 관계를 그래프 형태로 표현이였다.

-클러스터링에 적합하지 않다.

ORM(object-relational mapping )

-객체관계맵핑을 의미한다.

-DB에 저장된 데이터와 자바에서 다루는 데이터에 대응하는 기법이다.

-데이터베이스 상에서 검색과 일관성을 유지하는 데에 발생하는 차이점을 보완하기 위한 기법이다.

  • 두가지 기법이 있다
    • DAO & DTO
    • JPA 를 사용한다.
  • JPA는
    • ORM을 구현하는 자바 EE규격을의미한다
    • DB를 자바 오브젝트로 조작할 수 있다.

https://namu.wiki/w/NoSQL