이론 정리

데이터 중심 애플리케이션 설계 2장 정리

철매존 2024. 11. 18. 06:41
728x90
반응형
  • 정리

    • 이거는 다른사람도 꼭 알아야 한다.(아주 중요)

      데이터 베이스 질의는 명령형(절차 기술)이 아닌 선언(패턴 지정)형!

      디비 엔진의 상세 구현이 숨겨져있어서(선언형 질의의 장점) 질의를 변경하지 않고도 성능을 향상시킬 수 있는 이유..

      명령형이 쓰였을 때 안좋은 케이스: css 한줄의 코드를 DOM api 로 작성했을때 여러가지 (예상치 못한 삭제, 태그 변경 등) 상황에 따라 코드를 재 작성 해야 함

      선언형 방식은 순서보장이 되지 않는 등 디테일한 조작은 불가능하지만, 그래서 최적화가 가능한 것 —> sql 이 기능적으로 더 제한적이라는 사실은 .. 최적화할 수 있는 여지를 더 많이 준다는 의미

    • 이거는 알면 좋을 것 같다.(빨간거 다음으로 중요

      관계형 데이터 베이스와 문서 데이터베이스는 시간이 지남에 따라 점점 더 비슷해지고 있다

      반 관계형 데이터베이스, 구글 스패너

      sql 에서 이곳 저곳 테이블을 스캔할 때 데이터를 적재,저장하는 데이터가 불필요하게 많아지는 문제를 이렇게 nosql처럼 데이터를 저장해놓고 접근할 때 지역성의 이득을 본다. 그렇게 하기 위해 테이블간의 계층을 미리 지정해서 아래와 같이 여러 테이블에 분산된 데이터를 정렬한다.

      스크린샷 2023-09-06 오후 10.19.59.png

    • 이거는 내가 개인적으로 흥미로웠다.(마음에 들었다)

      text 문자를 테이블로 따로 떼서 id 로 나타내는 것의 장점 <33p>

  • 2장

    • 대부분 애플리케이션은 하나의 데이터 모델을 다른 데이터 모델 위에 계층을 둬서 만듬

      • 그래서 데이터 저장과 질의를 위한 다양한 범용 데이터 모델을 살펴본다.

      관계형 모델과 문서 모델

    • Relation

      • 각 관계는 순서 없는 tuple 모임
      • 근원은 비즈니스 데이터 처리(트랜잭션이나 일괄처리)
    • NoSQL

      • Not Only SQL
      • RDB에서 지원하지 않는 특수 질의
      • RDB보다 동적이고 표현력이 풍부한 데이터 모델 요구 등

      객체 관계형 불일치

    • 보통은 개발이 객체지향 프로그래밍으로 이루어짐

    • 임피던스 불일치에의 문제

      • 관계형 <-> 객체 사이의 전환 계층을 필요로 하는것
      • ORM은 이러한 보일러플레이트 양을 줄여주지만 차이를 완벽히 숨길수는 없음

      예시

    • 이력서 같은걸 생각해보면 JSON표현으로 적합

      • JSON을 쓰면 모든 정보가 한곳에 있어서 한번 가져오면 싹다 들고옴
    • 다대일, 다대다 관계

      • 지역이나 회사같은것들은 그냥 평문이 아니라 ID값을 가지고 있으면 여러 장점이 있다.
        • 일관된 문자 저장
        • 모호함 회피(동명의 다른거)
        • 갱신의 편리함
        • 현지화 지원(한 ID에 여러 언어를 저장한다면)
        • 더 나은 검색 가능
      • ID는 변경 필요X
      • documentDB는 조인 지원이 약함(JSON같은거는 위에서 아래를 찾아가기는 쉽지만 하위를 통해 상위를 찾기는 힘드니까)
        • 다대일 관계 적합하지 않다는것
          • 하려면 DB가 아니라 애플리케이션에서 데이터를 가져와서 처리해야한다.
        • 보면 처음에는 Join이 없어도 됐어도 구현하다보면 필요해질수 있다. 어떻게 하지?
          • 네트워크 모델
            • == 코다실 모델
            • 얘는 다중 부모가 있을 수 있다.
              • 아까 이력서같은걸로 생각해보면 지역->그지역사람 전체 이렇게 사람밑에 있으면서 동시에 지역밑에 있는 느낌
                • 요런 식으로 하면 다대일, 다대다 모델링 가능
            • 레코드 접근을 하려면 최상위부터 쫘라락 내려가는 수밖에 없음
            • 딱봐도 변경을 하거나 하면 모든 부모를 찾아가는 복잡한 문제가 있어 유연성 떨어짐
          • 관계형 모델
            • 얘는 우리가 아는 그 RDB같은걸로 단순히 튜플의 컬렉션이 다임
    • 정리하자면 documentDB는 별도 테이블이 아닌 상위 레코드 내에 중첩된 레코드(일대다)를 저장함.

    • 그러나 다대일과 다대다의 경우 RDB와 동일하고, 거기서는 FK라고 부르던걸 여기서는 Document Reference 즉 문서 참조라고 부른다.

      RDB와 요즘의 documentDB

    • 일단 차이만 집중하면

      • documentDB의 장점
        • 스키마 유연성, 지역성에 기인한 더 나은 성능
        • 특정 애플리케이션의 경우 그곳의 데이터 구조와 비슷
      • RDB
        • 조인, 다대일, 다대다를 더 잘 지원함
    • 보통 한번에 데이터를 가져오기만 하는 문서같은 느낌에는 documentDB

    • 다대다같은걸 쓰면 RDB가 좋지

      document의 스키마 유연성

    • JSON은 문서의 데이터에 어떤 스키마를 강요하지 않는다.

    • 문서형데이터베이스는 종종 스키마리스로 불리지만 오해의 소지가 있다.

      • 암묵적인 스키마가 있기는 한데 DB가 이를 강요하지 않음
      • 읽기 스키마 : 데이터 구조는 암묵적으로 데이터를 읽을 때에만 해석된다.
      • 쓰기 스키마 : RDB의 전통적인 방법이고 DB는 데이터가 스키마를 따르고 있음을 보장
      • 그러니까 오브젝트별로 유형이 다르거나, 관계에 의해 변경하는 구조가 아니면 documentDB가 아주 좋음

      질의를 위한 데이터 지역성

    • 애플리케이션이 자주 전체 문서에 접근해야 할 때 저장소 지역성을 활용하면 성능 이점이 있다.

      • 한번에 많은것을 요구한다면 이게 좋은거지 다가져오니까
    • 구글 스패너, 오라클 다중 테이블 색인 클러스터 테이블, 빅테이블데이터모델의 칼럼 패밀리개념 등등

      • 이거 신기하다... 데이터를 저장할 때에 아예 부모 및에 데이터를 저장시키는 식으로 지역성을 확보

      RDB와 documentDB의 통합

    • RDB는 Json지원, document는 관계형 조인 지원

    • 둘은 비슷해지고 있다.

      데이터를 위한 질의 언어

    • SQL : 선언형

    • IMS, 코다실 : 명령형

    • 프로그래밍언어는 보통 명령형이다.

      • 명령형은 보통 순서랑 연산을 수행하도록 컴퓨터에게 지시한다.
    • SQL은 어떻게 가져와라! 하는 방법이 아니라 그 결과에 필요한 조건과 데이터 변환(정렬, 그룹화, 집계)를 지정하기만 하면 된다. -> 선언하는거니까

      • 그러면 최적화는 최적화기가 알아서 해줌^~^
      • 이 장점은 명령형보다 간결하고, 특히 중요한것은 상세 구현이 숨겨져있어 질의 변경 없이 성능 향상이 가능하다는것
      • 병렬 실행에도 적합하다.
        • 얘는 명령의 순서가 있는것도 아니라 그냥 조건대로 가져만 와라 하는거라 병렬에 더 좋음

      웹에서의 선언형 질의

    • CSS같은것도 선언형이다(어디가 어떻게 변경되는걸 원하고 뭐 어찌 되는지는 관심없)

      • 그거를 javascipt의 코어DOM 명령형을 쓰면 삭제되거나 태그 변경 등에 따라 코드를 바꾸어 주어야하거나 코드도 굉장히 길고 난해해진다.

      맵리듀스 질의

    • 이거 자바에서 스트림할때도 봤지

    • 읽기 전용 질의를 수행할 때에 사용된다.

    • 여기서는 몽고DB모델 사용에 대해서

      • 선언형도 아니고 명령형도 아닌 어딘가
      • 처리 프레임워크가 반복적으로 호출하는 조각 코드
      • map, reduce함수 기반
    • 제약사항이 있는데, 순수함수여야한다(입력으로 전달된 데이터만 사용가능, 추가적인 데이터베이스 질의 수행 불가, 사이드이펙트 없음)

      • 요런 제약이 있어서 DB가 임의 순서로 어디서나 이 함수를 실행가능. 또 장애가 있어도 함수 재실행 가능
    • 참고로 이거 좋긴 한데 이것만 쓸수 있는것도 아니고 작성이 어려울수도 있다.

    • JSON기반을 쓰는 집계 파이프라인이라는것도 있다.


    GraphDB

    • 오랜만에 본다...

    • 다대다가 많으면 GraphDB를 쓴다.

    • 그래프디비는 정점(노드 혹은 엔티티)랑 간선(관계 혹은 호)

    • 속성 그래프 모델

      • 네오포제이, 타이탄, 인피니티그래프 등
    • 트리플 저장소 모델

      • Datomic, 알레그로그래프 등

      속성 그래프

    • 정점

      • 고유 식별자
      • 유출 간선 집합
      • 유입 간선 집합
      • 속성 컬렉션(키-값 쌍)
    • 간선

      • 고유 식별자
      • 간선이 시작하는 정점(꼬리정점)
      • 간선이 끝나는 정점(머리 정점)
      • 두 정점 간 관계 유형 설명하는 레이블
      • 속성 컬렉션(키-값 쌍)
    • 정점은 다른 정점과 간선으로 연결된다. 특정 유형과 관련 여부를 제한하는 스키마는 없다.

    • 정점이 주어지면 정점의 유입과 유출 간선을 효율적으로 찾을 수 있고 그래프를 순회할 수 있다. 즉 일련의 정점을 따라 앞뒤 방향으로 순회

    • 다른 유형의 관계에 서로 다른 레이블을 사용하면 단일 그래프에 다른 유형의 정보를 저장하면서도 데이터 모델을 깔끔하게 유지 가능

    • 국가마다 지역 구조가 다른것같은 RDB로 보여주기 힘든것도 얘는 쉽게 보여줄 수 있음

      사이퍼 질의 언어

    • 속성 그래프를 위한 선언형 질의 언어

    • 예를 들어 미국에서 유럽으로 이민 온 모든 사람들의 이름 찾기 를 한다면?

      • person에서 name이 US인 속성을 갖는 location이 될 때 까지 born_in간선을 따라감
      • person에서 name이 eurpe인 속성을 갖는 location이 될 때 까지 live_in간선을 따라감
      • 이거 두개가 MATCH되면 됨
    • 이런 식으로 하면 수행의 상세한 것을 지시하지 않아도 최적화된 방법을 알아서 찾아간다(선언형)

      SQL의 그래프 질의

    • RDB도 가능하다. 근데 어렵다.

    • 재귀 공통 테이블 식? 을 쓴다고 한다..

      트리플 저장소와 스파클

    • 속성 그래프 모델과 거의 동등하다.

    • 이거는 모든 정보를 주어, 서술어, 목적어처럼 간단한 세 부분 구문형식으로 저장한다.

    • 주어

      • 정점과 동등
    • 목적어

      • 문자열이나 숫자 등의 원시 데이터타입의 값
      • 그래프의 다른 정점

      시맨틱 웹

    • 이미 사람이 읽을 수 있는 텍스트와 그림으로 정보를 게시하고 있으니 컴퓨터가 읽게끔 기계가 판독 가능한 데이터로도 정보를 게시하는건 어떨까? 하는 개념

    • 자원기술프레임워크(RDF)는 서로 다른 웹사이트가 일관된 형식으로 데이터를 게시하기 위한 방법 제안

    • 일단 지금은 잘 안쓰기는 한데 좋은 작업이 있음.

      RDF데이터 모델

    • 이거는 결국 인터넷에 있는 정보 교환을 위해 설계하는 것이다.

    • 그래서 주어, 서술어, 목적어는 주로 URL이다.

      스파클 질의 언어

    • 구조적으로 사이퍼랑 비슷

    • 얘는 근데 속성이랑 간선을 따로 구분하지 않고 서술어를 사용하기 떄문에 보기 더 쉽고 동일한 구문 사용 가능

      데이터로그

    • 질의 언어의 기반이 되는 초석을 제공하는 오래된 녀석

    • 얘는 (주어, 서술어, 목적어) 형태의 트리플과는 다르게

    • 서술어(주어, 목적어) 로 작성한다.

      정리

    • 요구사항에 맞춰서 어떤걸 쓸지 찾아보는게 중요

    • NoSQL

      • 문서형 : 서로 연관은 없고 데이터가 문서 자체인 경우 좋음
      • 그래프 : 서로 연관이 있을거라고 잠재적으로 생각하고 ㄱㄱ
### 3색 정리

- 이거는 다른사람도 꼭 알아야 한다.(아주 중요)
    - ID는 아무런 의미가 없기 때문에 변경할 필요가 없다(34p)
        - 예전에 공부했던 내용중 자연키vs인조키 관련인데 이거 은근 중요한 내용이라 생각해서 적었다.
    - 선언형 / 명령형 언어에 대해(43p~)
        - java stream에 대해 처음 배울 때에도 선언형에 대해 배웠는데, 실제로 장점을 알 수 있었다.
        - 그래서 인덱스 생성이랑 질의가 달라도 옵티마이저가 알아서 최적화를 잘 해주는걸까? 싶은 느낌
            - 근데 약간의 블랙박스 너낌
- 이거는 알면 좋을 것 같다.(빨간거 다음으로 중요)
    - 문서형 데이터베이스와 관계형 데이터베이스의 통합(42p)
        - 둘이 점점 비슷해지는게 있어보인다.
            - RDB에 json같은거 넣을 수 있는게 기억난다
                - 그리고 RDB에서도 join이 많은것을 지양해서 집계테이블을 만들고 있는데, 두개를 합치면 되게 좋아보임
                    - 예를 들어 책(좋아요한사람-json, 댓글상위몇명-json, 댓글갯수총합-int 등)
- 이거는 내가 개인적으로 흥미로웠다.(마음에 들었다)
    - 데이터 지역성(41p ~)
        - 아예 저장할때 부모 밑에 넣어버리는 방식인게 신기했다.
            - 근데 이거는 좀 궁금한게 몇개 있는데
                1. 여러 부모에게 소속되는 경우(예를들어 악어가죽 → 가방, 지갑 등에서 사용 등..)
                    1. 이런거는 가장 많이 사용되는 부모 아래에 일단 두는게 맞을것같기도 한데 모르겠다.
                2. 만약 변경된다면??
                    1. 내가 이직을 하면 현대차→류찬 에서 카카오→류찬 이렇게 바뀔텐데 RDB의 업데이트는 주소를 그대로 두고 변경하지 않나 싶어서 지역성이 깨지지는 않을까? 싶었다.
반응형