決戦IndexedDB

これは何?

ブラウザに無限のストレージが用意されました。

  1. COOKIEは4KBまで
  2. LocalStorageは5MBまで
  3. 外部ファイル?セキュリティのためアクセスできません。

この軛がようやく解消された。

どうして決戦なのか

どうしてこの仕様になったかわからない仕様だらけ。この苦難のため2年ほど足踏みした。どうしてもクライアントサイドで大量データを扱わなければいけないので・・・

  1. 非同期、非同期非同期の連続、そしてバージョンという概念
    1. UIスレッドをノンブロッキングなのはわかりますが・・・非同期処理のいなし方知らないと詰む・・・
  2. キーが外部もちとデータ内保持と二種類あった。
    1. ここを理解しないと目的のデータを取り出せない。
      1. キーが外部もち:KVSのようなイメージ:OutLine−Key
      2. キーがデータ内保持:RDBMSの様に一部のプロパティーがキー:InLine−Key
      3. なにも知らずにデータ投入するとキーが外部もちになって自動連番がキーに成るため、目的のレコードを取り出せなくなってしまう。
      4. 数万オーダーのデータ処理を考えると取り出すときに全件取得はありえない。多分メモリ不足でブラウザが落ちる。
    2. DBのバージョンという概念がありまして・・・
      1. 追加、修正、削除、CRUDのCUDはバージョンアップが必要
      2. バージョンを正確に記述しないとObjectStoreの削除と作成がうまくできない。
      3. 一つのDBの中に複数のObjectStoreが有る状態で同時複数のDropCreateをトランザくショナルにやろうとするとなかなか壮観な非同期入れ子状態に成る。
  3. 溢れるエラー
    1. DBのバージョン違いはひどかった
    2. エラーの内容もわかりづらい。UnknownErrorってなんなんだー
      1. もちろんPK違反はわかるんだけどね。ConstraintError
  4. KeyPathという未解明の仕様
    1. 名前からしてパスのようにKeyを構成できるように聞こえるが利用方法がよくわからない。
    2. keyにピリオドは入れられない。
    3. もしかしたら1オブジェクトストア内に入れ子でデータ持って検索できるかもと思ったがに駄目だった。
  5. めまぐるしく変わる仕様
    1. 仕方ないのだが、実装も仕様も安定しなかった。
      1. CRUDでのバージョン取り扱いが以前は必要だったり
      2. ChromeAPI実装が標準から離れていたり
    2. ようやく現在はまともに動くように。
      1. Chrome37ではRangeにundefinedを渡すとエラーに成る。

どうあれば嬉しかったか

  1. 普通のSQLだったら良かったのに
    1. WebSQLが退けられた理由をまだ把握していない。
  2. 非同期の他に同期のオプションもあればよかったのに
    1. 非同期はハードル高いよ

特徴

以下RDBMSに比較して

  1. キーは基本一個です。
    1. 複数キーは出来るようだが、めんどくさくてやってない。
  2. 検索にはキーを使えます。
    1. 範囲絞り込みが可能です。
      1. RDBMSの様に使おうとするとキー設計に親子関係を練り込むことを考えてしまいます。
      2. jsに処理を移譲するのはやはりですね・・・ネイティブで済ませられるならソレで。
    2. 複数のキーを連携させることはできません。できる?
      1. Indexは複数作成可能なようですが。
  3. Indexで検索が出来るようです。
    1. できるようです。
  4. ただし、複雑な条件を受け付けるAPIはないです。
    1. いったんjs上にオブジェクトを展開してそこで比較するなどの条件適用が必要になります。
    2. JOIN系、GroupBy、UnionのAPIは無いです。
  5. 非同期につぐ非同期なので変な処理をはさむと遅いです。
  6. 変な処理がなければLocalStorageよりは速い気がする。
  7. FirefoxChromeは普通に動く。
    1. SafariもIE10以降も動くらしいが、悪いな家にはLinuxしかないんだ。
  8. Chromeには削除する方法があるがFirefoxCookie前消しでのみ対応
    1. 自前でDB初期化ロジックが必要

展望

何もかもDBに突っ込もうぜ!
  1. 画像
  2. 設定
クラサバが復権する

有る意味悪夢

WebRTCと組み合わせれば

夢の認証以外ストレージレスサービスが構築可能に。

セキュリティ

まあ暗号化しておかないと見る人見たら丸バレだよね

  1. ChromeとかBookmarkletとかとか。