よしたく blog

ほぼ週刊で記事を書いています

データ指向アプリケーションデザイン の第I部を読んだ

「データ指向アプリケーションデザイン」 の第I部を読み終えた。 この部はタイトルにもあるように、データを扱うためのシステムについて全般的に述べられている。

第I部データシステムの基礎

  • 1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
    • 1.1 データシステムに関する考察
    • 1.2 信頼性
      • 1.2.1 ハードウェアの障害
      • 1.2.2 ソフトウェアのエラー
      • 1.2.3 ヒューマンエラー
      • 1.2.4 信頼性の重要度
    • 1.3 スケーラビリティ
      • 1.3.1 負荷の表現
      • 1.3.2 パフォーマンスの表現
      • 1.3.3 負荷への対処のアプローチ
    • 1.4 メンテナンス性
      • 1.4.1 運用性:運用担当者への配慮
      • 1.4.2 単純さ:複雑さの管理
      • 1.4.3 進化性:変更への配慮
    • まとめ 
  • 2章 データモデルとクエリ言語
    • 2.1 リレーショナルモデルとドキュメントモデル
      • 2.1.1 NoSQLの誕生
      • 2.1.2 オブジェクトとリレーショナルのミスマッチ
      • 2.1.3 多対一と多対多の関係
      • 2.1.4 ドキュメントデータベースは歴史を繰り返すのか?
      • 2.1.5 今日のリレーショナルデータベースとドキュメントデータベース
    • 2.2 データのためのクエリ言語
      • 2.2.1 Web上での宣言的クエリ
      • 2.2.2 MapReduceでのクエリ
    • 2.3 グラフ型のデータモデル
      • 2.3.1 プロパティグラフ
      • 2.3.2 Cypherクエリ言語
      • 2.3.3 SQLでのグラフクエリ
      • 2.3.4 トリプルストアとSPARQL
      • 2.3.5 礎となったもの:Datalog
    • まとめ 
  • 3章 ストレージと抽出
    • 3.1 データベースを駆動するデータ構造
      • 3.1.1 ハッシュインデックス
      • 3.1.2 SSTableとLSMツリー
      • 3.1.3 Bツリー
      • 3.1.4 BツリーとLSMツリーの比較
      • 3.1.5 その他のインデックス構造
    • 3.2 トランザクション処理か、分析処理か?
    • 3.3 列指向ストレージ
      • 3.3.1 列の圧縮
      • 3.3.2 列ストレージにおけるソート順序
      • 3.3.3 列指向ストレージへの書き込み
      • 3.3.4 集計:データキューブとマテリアライズドビュー
    • まとめ 
  • 4章 エンコーディングと進化
    • 4.1 データエンコードのフォーマット
      • 4.1.1 言語固有のフォーマット
      • 4.1.2 JSONXML、様々なバイナリフォーマット
      • 4.1.3 ThriftとProtocol Buffers
      • 4.1.4 Avro
      • 4.1.5 スキーマのメリット
    • 4.2 データフローの形態
      • 4.2.1 データベース経由でのデータフロー
      • 4.2.2 サービス経由でのデータフロー:RESTとRPC
      • 4.2.3 メッセージパッシングによるデータフロー
    • まとめ 

非機能要件

信頼性、スケーラビリティ、メンテナンス性といった「非機能要件」についてまとめられた章だった。個人が使うような小規模なプロジェクトであれば、非機能要件については深く考える必要はないかもしれないが、今日のデータ社会においてはとても大切なことだと書かれている。自分もユーザに対してクラウドの導入提案や、導入後の運用相談を受ける場に立ち会うことが多く納得しながら読み進めることができた。

非機能要件についてはマイクロソフトのドキュメントがよくまとまっているのでリンクを貼っておく。

docs.microsoft.com

データモデルとクエリモデルの種類

リレーショナルデータベースとNoSQLのデータモデルについて書かれている章だった。筆者としてはNoSQLのグラフ型データモデルを一般的と書いていたが個人的にはイメージがつかなかった。FacebookのようなSNS系のサービスや道路や鉄道の路線を示すのに使われることが多いようだ。また、知人に質問したところ、システムのネットワークの設定を表す際に使われるケースもあるようだ。グラフデータベースとしてはNeo4jがある

neo4j.com

クエリに関してもまとめられていた章だった。しかしクエリと言われるとSQLしかイメージできなかったためCSSが「Webにおける宣言的クエリ」と紹介されていたのは新鮮だった。

データベースの内部

データベースの内部について書かれている章だった。 一番最初に書かれていたが、世界で最も単純なデータベースが印象的だった。これはgetとsetの2つのBash関数で実装されたものだった。自分もリッチなデータベースを使うほどではないが、データをスタックとして保存したいときがあり似たような実装をしたことを思い出した。

OLTP(オンライン・トランザクション・プロセッシング)とOLAP(オンライン・アナリティク・プロセッシング)についてもまとめられていた。

業務ではBIツールなど分析に関係するものが中心なのでOLAPは親しみがあったが、文章にも「データウェアハウスやそれに分類する分析システムは、エンドユーザではなく主にビジネスアナリストが使用するものなので、それほど知られてはいません。」と書いてありあらためて自分がニッチな業務に携わっているんだなと自覚できた。

普段触らないOLTP側の話では、「log-structured」と「インプレース」の考え方があることを学べた。

まとめ

  • データ指向アプリケーションデザイン の第I部を読んだ
  • 第I部データシステムの基礎と題されている通り、分野的に広く書かれていた
  • 自分が知っていることと知らないことの再確認が出来た

参考文献

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理

データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理