Firestore(NoSQL)_구조_이해하기 - boostcampwm-2024/and04-Nature-Album GitHub Wiki
Firestore(NoSQL) 구조 이해하기
-
친구 기능 관련 NoSQL 구조 설계 작업 전 로그인 관련 NoSQL 상태를 먼저 살펴보았다. Collection 이름이 USER라서 잠시 혼동했기 때문이다.
Collection이름이 USER라서 잠시 혼동했다. 그래서 정리했다.
- NoSQL과 RDB(Relational Database)는 구조적으로 많이 다르기 때문에 처음에는 헷갈릴 수 있다. 특히 Firestore 같은 NoSQL은 데이터를 트리 형태로 관리하므로, Collection과 Document 간의 계층적 구조를 이해하는 것이 중요하다.
RDB와 NoSQL의 주요 차이점
특징 | RDB (MySQL, PostgreSQL 등) | NoSQL (Firestore) |
---|---|---|
구조 | 테이블, 열, 행으로 구성 | Collection과 Document로 구성 |
스키마 | 고정된 스키마가 필요 | 스키마가 유연하며, Document마다 필드가 달라도 됨 |
관계 | 테이블 간 관계(Join)를 통해 데이터 연결 | Collection과 Sub-Collection으로 계층적 관계 표현 |
확장성 | 수직적 확장이 주로 사용됨 (서버 성능 향상) | 수평적 확장에 유리 (샤딩, 분산 처리) |
데이터 읽기 | SQL 쿼리로 복잡한 관계 데이터를 효율적으로 처리 가능 | 단일 Document를 읽는 데 빠르고 단순함 |
Firestore의 핵심 개념
- Collection
- 데이터를 그룹화하는 최상위 레벨.
- RDB의 테이블과 유사한 개념이지만, 하위에 Sub-Collection을 가질 수 있음.
- 예:
USER
,LABEL
,PHOTOS
.
- Document
- Collection 안에 저장되는 단위 데이터.
- RDB의
행(Row)
과 유사. - 각 Document는 고유 ID를 가지며 JSON 형식으로 데이터를 저장.
- 예:
UID_12345
는USER
Collection의 하나의 Document.
- Sub-Collection
- Document 안에 또 다른 Collection을 생성할 수 있음.
- 예:
USER > UID_12345 > LABEL
구조.
- 스키마 없음
- 각 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"