Firestore의 특징 및 아키텍처 공개

15894 단어 FirebaseFluttertech

TL;DR


관계 데이터베이스보다 더 사용하기 어렵다고 여겨지는 퍼스트 스토어의 구조와 관건을 공개한다.

문서 DB 극복 방법


firestore의 특징 중 하나는 문서 데이터베이스입니다.관계 데이터베이스에서 2차원 표로 표시하기 때문에 같은 필드의 데이터 형식은 반드시 같아야 한다.
필드
데이터 형식
name
String
age
int
문서 데이터베이스 Firestore에서 형식을 혼합할 수 있습니다.다음 예에서 첫 번째age는 int형이고 두 번째age는 문자열입니다.SDK를 직접 이용하면 맵형 제공이어서 사고가 발생하기 쉽다.
sample.json
[
{
  "name": "sarukun"
  "age": 20
},
{
  "name": "sarukun"
  "age": "20"
},
]
이 문제는 다음 Enity 클래스를 사용하여 해결할 수 있습니다.
user.dart
class User {
  final String name;
  final int age;
  User({required this.name, required age});

  factory User.fromMap(Map map) => User(
    name: map['name'], 
    age: map['age']
  );

  Map toMap() => {
    'name': name,
    'age': age
  }
}
이런 상태에서 사용자 상태를 추가할 때 구조기로 기본값을 끼워 넣으면 프로그램의 내용에 신경 쓰지 않고 처리할 수 있다.
user.dart
class User {
  final String name;
  final int age;
  final bool suspended
  User({required this.name, required age});

  factory User.fromMap(Map map) => User(
    name: map['name'], 
    age: map['age']
    suspended: map['suspended'] ?? false
  );

  Map toMap() => {
    'name': name,
    'age': age
    'suspended': suspended
  }
}
단,suspended로 선별하면 수치가 없는 문서를 얻을 수 없기 때문에 선별하려면 미리 이동해야 합니다.Enity 클래스를 사용하면 모든 문서를 저장하기만 하면 간단하게 마이그레이션할 수 있습니다.

하위 모음집 요점


RDB에 없는 Firesore의 두 번째 특징은 하위 모음집입니다.예를 들어 User와 좋아하는 음료를 RDB로 표현한다면 다음과 같다.

User


필드
데이터 형식
name
String

UserFavorite


필드
데이터 형식
userId
String
itemId
int

Item


필드
데이터 형식
itemId
String
name
int
이 작업을 처리하려면 User와 UserFavorite 두 개의 문서를 사용하십시오./Usersuser.dart
class User {
  final String name;
  User({required this.name});

  factory User.fromMap(Map map) => User(
    name: map['name']
  );

  Map toMap() => {
    'name': name
  }
}
/Users/$uid/Favoritesuser.dart
class UserFavorite {
  final String name;
  User({required this.name});

  factory UserFavorite.fromMap(Map map) => User(
    name: map['name']
  );

  Map toMap() => {
    'name': name
  }
}
Favorite를 Users의 하위 모음집으로 사용하는 것이 중요합니다.이렇게 하면 소장에서 특정한 사용자가 좋아하는 항목을 표현할 수 있다.하위 모음에서는 Stream을 통해 상태 모니터링을 수행할 수 있습니다.
이렇게 하면 프로젝트 이름을 변경할 때 모든 사용자의 데이터를 바꿔야 하기 때문에 Item 테이블을 따로 만들어서 Map으로 저장하고 Favorites에 감아name를 주 데이터로 바꿀 수 있습니다.이는 Rails의 includes를 사용한 N+1의 방어 방법과 같다.
sample.dart
final itemMap = <String, Item>{};
<UserFavorite>[].map((e) => e.copyWith(item: itemMap[e.itemId]))
item.dart
class Item {
  final String name;
  final String id;
  Item({required this.id, required this.name});

  factory Item.fromMap(Map map) => User(
    name: map['name']
     id: map['id']
  );

  Map toMap() => {
    'id': id
    'name': name
  }
}
데이터베이스가 주변을 방문해 팀 내 정비고에 있으면 무의식적으로 개발할 수 있다.Napps도 사내 ORM을 사용해 부하를 낮춘다.

좋은 웹페이지 즐겨찾기