SlideShare ist ein Scribd-Unternehmen logo
1 von 9
Firestoreでマスタ取得を
効率化するいくつかの方法
西宮大貴( @hnishim)
今日のお題:以下についてFJUGの
皆さまにいただいた提案をまとめた
● 数百〜1,000件のマスタデータ用ドキュメントが
Firestore上にあり、ユーザ(iOS)は日々の操作でそ
のマスタから選択したいデータを選ぶようにしたい
● 部分一致検索をさせたいので、Firestoreからデータ取
得するときのwhere句で都度取得はNG
● 選択時に使用する情報はマスタデータの全情報ではな
く、名前(など)だけでOK
案1
● 本物のマスタデータ(gins)とは
別に専用のコレクション(
masterSummary)を作り、そ
の中に1ドキュメントだけ保持
● masterSummaryのドキュメン
トに配列 or マップ(辞書)型
でマスタデータの名前を格納
● マスタデータの変更時に
FunctionsでmasterSummaryド
キュメントへ変更を反映
案2
● 案1と同様だが、マスタデータ
の変更時に、マスタサマリも
更新する処理を組み込む
案3
● そもそもクライアントにマス
タデータをダウンロードせず
にFirestore上で部分一致検索
実現してしまう
○ 基本的に n-gram
○ マスタドキュメントに名前を前方
から1文字づつ削った値を全パタ
ーン保持
○ それぞれの配列に前方一致検索を
かける
以下記事参照 前方一致検索:https://note.mu/shogoyamada/n/n8fe9486fcbec
n-gram 的な部分一致検索:
https://qiita.com/oukayuka/items/d3cee72501a55e8be44a
案4
● マスタデータ(gins)とは別にマ
スタのバージョン情報を持た
せ、マスタデータが更新され
るたびにバージョンを
increment
● クライアント側でバージョン
情報を比較して差異があれば
マスタデータを取得
ということで案4で実装しました
if let v = UserDefaults.standard.dictionary(forKey: "masterVersion") {
versionOnClient = v["gins"] as? Int ?? 0
}
db.collection("settings").document("masterVersions").getDocument() { (document, error) in
versionOnFS = document.data()[“gins”] as? Int ?? 0
let source: FirestoreSource = (versionOnClient == versionOnFS) ? .cache : .default
var docs = [DocumentSnapshot]()
self.db.collection(“gins”).getDocuments(source: source) { (querySnapShot, err) in
docs = querySnapShot!.documents
versionOnClient = versionOnFS
UserDefaults.standard.set(versionOnClient, forKey: "masterVersion")
masterData = docs.compactMap({ Master(key: $0.documentID, data: $0.data()!) })
}
}
ということで案4で実装しました
import * as admin from 'firebase-admin';
import { FieldValue } from '@google-cloud/firestore';
admin.initializeApp(functions.config().firebase);
const firestore = admin.firestore();
export const onWriteMasterGins = functions.firestore.document('/gins/{recordId}',)
.onWrite(async (change, context) => {
await incrementGinsVersion(change, context);
});
async function incrementGinsVersion(_snapshot:
functions.Change<FirebaseFirestore.DocumentSnapshot> | undefined, context:
functions.EventContext) {
await firestore.collection('systemData').doc('masterVersions')
.set({gins: FieldValue.increment(1.0)}, {merge: true});
}
Thank you!
@GinbaseApp
Ginbase
お酒「ジン」専用の記録アプリを個人開発してます。

Weitere ähnliche Inhalte

Was ist angesagt?

Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介T. Suwa
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜MicroAd, Inc.(Engineer)
 
マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術MicroAd, Inc.(Engineer)
 
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019Game Tools & Middleware Forum
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編Fixstars Corporation
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習西岡 賢一郎
 
マイクロサービスっぽい感じの話
マイクロサービスっぽい感じの話マイクロサービスっぽい感じの話
マイクロサービスっぽい感じの話Makoto Haruyama
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 

Was ist angesagt? (20)

Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜
Scala、DDD、Akkaで立ち向かう 〜広告配信システムに課せられた100msの制約〜
 
マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術
 
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019
Game Server Services ではじめる サーバー開発運用しないゲーム開発 /GTMF2019
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習
 
マイクロサービスっぽい感じの話
マイクロサービスっぽい感じの話マイクロサービスっぽい感じの話
マイクロサービスっぽい感じの話
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
空間分割
空間分割空間分割
空間分割
 

Firestoreでマスタ取得を
効率化するいくつかの方法