Firestore(NoSQL)_구조_이해하기 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

Firestore(NoSQL) 구조 이해하기

  • 친구 기능 관련 NoSQL 구조 설계 작업 전 로그인 관련 NoSQL 상태를 먼저 살펴보았다. Collection 이름이 USER라서 잠시 혼동했기 때문이다.

    참고: Firebase_친구_기능_(1)

Collection이름이 USER라서 잠시 혼동했다. 그래서 정리했다.

  • NoSQL과 RDB(Relational Database)는 구조적으로 많이 다르기 때문에 처음에는 헷갈릴 수 있다. 특히 Firestore 같은 NoSQL은 데이터를 트리 형태로 관리하므로, CollectionDocument 간의 계층적 구조를 이해하는 것이 중요하다.

RDB와 NoSQL의 주요 차이점

특징 RDB (MySQL, PostgreSQL 등) NoSQL (Firestore)
구조 테이블, 열, 행으로 구성 Collection과 Document로 구성
스키마 고정된 스키마가 필요 스키마가 유연하며, Document마다 필드가 달라도 됨
관계 테이블 간 관계(Join)를 통해 데이터 연결 Collection과 Sub-Collection으로 계층적 관계 표현
확장성 수직적 확장이 주로 사용됨 (서버 성능 향상) 수평적 확장에 유리 (샤딩, 분산 처리)
데이터 읽기 SQL 쿼리로 복잡한 관계 데이터를 효율적으로 처리 가능 단일 Document를 읽는 데 빠르고 단순함

Firestore의 핵심 개념

  1. Collection
    • 데이터를 그룹화하는 최상위 레벨.
    • RDB의 테이블과 유사한 개념이지만, 하위에 Sub-Collection을 가질 수 있음.
    • 예: USER, LABEL, PHOTOS.
  2. Document
    • Collection 안에 저장되는 단위 데이터.
    • RDB의 행(Row)과 유사.
    • 각 Document는 고유 ID를 가지며 JSON 형식으로 데이터를 저장.
    • 예: UID_12345USER Collection의 하나의 Document.
  3. Sub-Collection
    • Document 안에 또 다른 Collection을 생성할 수 있음.
    • 예: USER > UID_12345 > LABEL 구조.
  4. 스키마 없음
    • 각 Document의 필드 구조가 같을 필요가 없음.
    • 유연하지만, 데이터를 읽고 쓸 때 직접 관리가 필요함.
    • 이래서 도윤님이 이것저것 넣어도 확장된다고 한거였음.

Firestore 구조를 쉽게 이해하는 방법

RDB와 비교해 보자:

  • RDB의 테이블 → Firestore의 Collection.
  • RDB의 행 → Firestore의 Document.
  • RDB의 테이블 간 관계 → Firestore의 Sub-Collection으로 계층화.

RDB 예제

테이블: User
| ID       | Name    | Email             |
|----------|---------|-------------------|
| UID_1234 | Alice   | [email protected] |
| UID_5678 | Bob     | [email protected]   |

테이블: Photo
| PhotoID  | UserID   | URL                  |
|----------|----------|----------------------|
| 1        | UID_1234 | photo1.jpg          |
| 2        | UID_5678 | photo2.jpg          |

Firestore로 변환

Collection: USER
  ├── Document: UID_1234
  │      ├── Field: Name = "Alice"
  │      ├── Field: Email = "[email protected]"
  │      ├── Collection: PHOTOS
  │             ├── Document: 1
  │             │      ├── Field: URL = "photo1.jpg"
  ├── Document: UID_5678
         ├── Field: Name = "Bob"
         ├── Field: Email = "[email protected]"
         ├── Collection: PHOTOS
                ├── Document: 2
                       ├── Field: URL = "photo2.jpg"