23 ポイント 投稿者 GN⁺ 2024-12-31 | 7件のコメント | WhatsAppで共有
  • SQLiteは、最も広く配布され、利用されているデータベースである

    • 1兆個以上のSQLiteデータベースが使われており、3人の人物によって保守されている
    • 外部からの貢献は受け付けていない
  • SQLiteは、他のすべてのデータベースエンジンを合計したよりも多く使われている

    • 数十億個のSQLiteのコピーが存在し、至るところにある
  • SQLiteは、最も広く配布されたソフトウェアモジュールの1つである

  • HwaciはSQLiteを開発した会社であり、音楽にも関心がある

    広告
  • SQLiteはアメリカ海軍の軍艦から始まった

    • D. Richard Hipp(DRH)は、USS Oscar Austinという海軍駆逐艦向けのソフトウェアを開発していた
    • サーバーがダウンするたびに、既存のソフトウェアが動作を停止する問題があった
    • DRHは、サーバーなしでも動作するデータベースを構想した
  • SQLiteは、法的な意味ではオープンソースではない

    • オープンソースには、特定の定義とOSIの承認を受けたライセンスが必要である
    • その代わり、SQLiteはパブリックドメインに属しており、オープンソースライセンスよりも制約が少ない
  • 外部からの貢献は受け付けていない

    • 招待された人だけが貢献でき、貢献はパブリックドメインへの献納が必要である
  • SQLiteのテストコード

    広告
    • SQLiteのコード1行ごとに、600行を超えるテストコードが存在する
    • テストはライブラリ内のすべての分岐を100%カバーしている
  • 一部のSQLiteテストはプロプライエタリである

    • TH3というテストスイートはプロプライエタリであり、アクセスするにはSQLiteコンソーシアムに加入する必要がある
  • SQLiteのビジネスモデル

    • 有償サポート、保守サービス、コンソーシアム会員権、商用拡張を通じて収益を生み出している
  • SQLiteは行動規範の代わりに倫理規範を持っている

    広告
  • SQLiteは非常に高速で、一部のユースケースではファイルシステムより35%速い

  • SQLiteは単一ライターモデルを採用している

    • 複数のライターを同時には許可しない
  • 他のデータベースとの違い

    • デフォルトではロールバックジャーナルモードを使用し、外部キーは無効化されている
    • 弱い型付けを採用しており、強い型付けはオプションである
  • SQLiteには型がない点が不便である

    • 型制約なしでデータを挿入できる
    広告
  • SQLiteは互換性を非常に重視している

    • すべてのSQLite 3のバージョンは、初期バージョンのデータベースファイルを読み書きできる
  • SQLiteの作者DRHは、既存のバージョン管理システムは適していないと判断し、Fossilを開発した

  • DRHは飛行機の中で、TAOCP本のアルゴリズムをもとにB-Treeをコーディングした

  • SQLiteの発音は "Ess-Cue-El-Lite" が推奨されているが、公式なガイドはない

7件のコメント

 
dalinaum 2024-12-31

SQLiteは、思っているほど高速なDBではありません。現在はサポート終了となったMongoDB Realmのほうが、はるかに高速です。人々にとって、速度はそれほど重要な選択要因ではなかったようです。

 
dalinaum 2025-01-01

Realm がなぜ速いのかと質問され、その根拠を求めていた方がいましたが、MongoDB がサポート終了に伴って記事を削除したようですね。

そこで、かつて働いていた立場から、覚えている技術的な理由を説明しようと思います。最大の利点は、Realm が SQLite と比べてより少ないメモリを使い、キャッシュヒット率が高かった点が最も大きな理由だったと思います。

Realm は基本的に、使用するサイズをもとにメモリに保存される容量を選択します。そのため、ユーザーが大きなサイズのデータ型を選んでも、数ビットの小さなサイズでシリアライズすることが多いです。実際にユーザーがより大きなデータを書く場合に変換を行います。

Realm は同じデータ型同士をまとめて隣接して保存します。ユーザーはテーブル内のすべてのデータにアクセスするのではなく、一部のデータに連続してアクセスすることが多いです。先ほど述べた小さいサイズでのエンコーディングのおかげで、一度にキャッシュで見つけられるデータははるかに多くなります。

Realm は POJO オブジェクトを hydrate せず、getter と setter で必要なときにデータを渡す方式です。そのために、Java の場合はバイトコードレベルで操作を行います。Protobuf のようなデータ型が当時 Meta の Facebook アプリクライアントで使われていた理由は、この hydrate 過程が性能上の大きな欠点になり、必要なデータだけにアクセスできることに利点があるためです。

Realm は SQLite と比べてほとんどのシナリオでずっと高速でしたが、この点は市場で大きな要因ではなかったと思います。

Realm の最大の競合相手は、Facebook が作った Parse だったと記憶しています。その後は Google の Firebase が競合になりました。この 2 つはローカルモバイルデータベースではなく、リモートにデータを簡単に保存できるサービスです。どうして Realm の競合がこの 2 つになるのかと思うかもしれませんが、実際のユーザーは単にどこかに保存できればよく、速度はそれほど重要ではなかったようです。

そしてその後、エリクソンが投資するようになり、Realm の範囲は縮小されました。エリクソンは、Realm が iOS である程度のシェアを持っているのに、さらに機能開発を進めることを理解していませんでした。そして、同期ソリューションとしての価値をより高く評価していました。その後、Realm は MongoDB に統合されました.

 
aer0700 2024-12-31

SQLiteを選んだ理由の8割は、扱いやすさだった気がしますね。

 
dalinaum 2025-01-01

これも重要な理由の一つだと思います。Realmはスレッドローカルベースの使い方を提供し、自動更新を提供しており、別のスレッドで新たにクエリを実行するとごく低いコストで同じデータを渡せると説明していました。また、別のスレッドにデータを渡さないよう推奨していましたが、こうした話を説明するのは簡単ではありませんでした。

 
sanggi 2024-12-31

本当にいろいろなところで sqlite が使われているみたいですね!

 
GN⁺ 2024-12-31
Hacker Newsの意見
  • OSIがオープンソースの基準ではないという意見がある。OSIのオープンソース定義は有用だが、批判や論争もある。SQLiteが法的にオープンソースではないとするのは誤った主張である

    • OSIの承認に依存するのは望ましくない。OSI承認ライセンス一覧は、実務的かつ政治的な歴史を反映しているにすぎない
    • SQLiteがオープンソースかどうかには議論がある。パブリックドメインへの献呈はライセンスではないためOSDを満たさないが、より開かれている
  • このブログは、人気のある話題について使い古された古い論点を再利用し、閲覧数とエンゲージメントを稼ごうとしているように見える

    • ブログの過去の投稿は技術的な深みが不足しており、誇張された内容が多い
  • SQLiteには行動規範(CoC)ではなく倫理規範(CoE)がある。CoCは外部コントリビューターの行動を制御するための道具として使われる一方、CoEはSQLite開発者が他者に対して意図する行動を表明するものである

  • SQLiteの発音には混乱がある。"Ess-Cue-El-Lite"と発音するとされるが、"S-Q-L-ite"と発音する人もいる

  • SQLiteはオプションでSTRICTテーブルをサポートしている。CREATE TABLE name (stuff TEXT) STRICTを使って型を強制できる

  • SQLiteはSQLデータベースであるだけでなく、NoSQLデータベースとして使うこともできる。JSONカラムを使ってデータを保存する方法が有用である

  • Richard Hippと一緒にプロジェクトを進めた経験がある。彼はサポート契約を通じて安定した収益を得ている

  • SQLiteのあるリリースでは、多数のマイクロ最適化によって性能が50%向上した

  • SQLiteを高速なプロトタイピングやログダンプに使っているが、マルチライターが欲しいときは難しさがある。これがSQLiteから離れる主な理由の一つである

  • SQLiteはシングルライターモデルを採用している。Redisもシングルスレッドモデルである

  • SQLiteの面白い事実の一つとして、ユーザーが夜中に開発者へ電話をかけ始めたため、デフォルト接頭辞をsqlite_からetilqs_に変更しなければならなかったことがある