アーキテクチャ

データ指向とは?設計・プログラミング・アプリケーションの違いと使い分け

データ指向とは?設計・プログラミング・アプリケーションの違いと使い分け

「データ指向」で検索すると、ゲームエンジンのメモリ配置を論じる技術ブログ、翔泳社の『データ指向プログラミング』、オライリーの『データ指向アプリケーションデザイン』が同じ検索結果に並びます。言葉は同じでも、解こうとしている問題は別物です。CPUキャッシュの話をいくら読んでも、分散データベースのレプリケーション設計の判断材料にはなりません。この記事では、データ指向設計(DOD)・データ指向プログラミング(DOP)・データ指向アプリケーション(data-intensive)の3つを出自から切り分け、オブジェクト指向との関係と、2026年11月5日に発行される『データ指向アプリケーションデザイン 第2版』で何が変わったかを整理します。

まとめ:データ指向の主な3用法と選択基準

呼び方 英語 主な現場 中心にある問題 代表文献
データ指向設計(DOD) Data-Oriented Design ゲーム・組込み CPUキャッシュとメモリ帯域 Acton、CppCon 2014
データ指向プログラミング(DOP) Data-Oriented Programming 業務アプリ全般 コードとデータの分離・不変性 Sharvit 2023/Goetz 2022
データ指向アプリケーション Data-Intensive Applications Web・データ基盤 信頼性・拡張性・保守性 Kleppmann 初版2019/第2版2026

迷ったときの判断はこうです。フレームレートやバッチの処理時間を縮めたいならDOD。Java・C#・Pythonで書かれたロジックが状態管理で壊れているならDOP。ユーザー数やデータ量の増加でデータベースが持たなくなってきたなら、データ指向アプリケーション、つまり分散システム設計の領域です。3つは対立する流派ではなく、扱うレイヤーが違います。書籍を探している人向けに先に書くと、『データ指向アプリケーションデザイン』の日本語版は第2版(Martin Kleppmann、Chris Riccomini著、664ページ、6,930円)が2026年11月5日に出ます。これから買うなら第2版です。

データ指向設計(DOD):メモリ配置とキャッシュ効率の設計

1万倍と10倍:CPUとメモリの性能差という出発点

DODはゲーム開発の現場から広まった設計手法です。代表的な講演の一つが、Insomniac GamesのMike ActonによるCppCon 2014の第3キーノート「Data-Oriented Design and C++」です。講演の公式動画の説明文には「The transformation of data is the only purpose of any program.」(データの変換こそがあらゆるプログラムの唯一の目的である)という一文があり、オブジェクトではなくデータの流れから設計を始める立場がここに表れています。

日本語で読める実測付きの解説としては、Cygames Engineers’ Blogの「データ指向設計」(2016年7月20日)があります。同記事は前提を「この30年でCPUの性能は1万倍以上になりましたが、メモリの転送速度は10倍にもなっていません。そのため、プログラムのボトルネックはメモリ帯域となることが多くなりました」と説明し、ゲーム業界で広まった要因の一つにPlayStation 3のCellプロセッサを挙げています。DODはアルゴリズム単体の計算量だけでなく、データの表現、配置、アクセス方法、入力から出力までの変換全体を見直します。着目するのは、同記事の言葉では「そのデータをどのようにメモリに配置し、どのように読み込み、どのように書きだすのか」です。

AoSからSoAへのデータ配置換え

具体的には、1つのオブジェクトに関連データをまとめる配置(AoS:Array of Structures)から、同じ種類のデータを配列としてまとめる配置(SoA:Structure of Arrays)へ組み替えます。次はその違いを示すC言語の宣言です。

typedef struct { float x, y, z; float hp; char name[32]; } EntityAoS;
EntityAoS aos[1024];

typedef struct {
    float x[1024], y[1024], z[1024];
    float hp[1024];
} EntitySoA;
EntitySoA soa;

このコードをApple clang 21.0.0(x86_64、-O2)でコンパイルし、sizeofを出力すると、EntityAoSは1体あたり48バイト、配列全体で49,152バイト、EntitySoAは16,384バイトでした。ただし、このSoA例ではnameを省いており、差の32,768バイトは名前領域の省略によるものです。同じ名前領域も保持するなら、この環境では合計49,152バイトとなり、配置変更だけで総容量が減るわけではありません。

差が出るのは読み込む量です。座標を更新するループが触るのはx・y・zの12バイトだけで、AoSでは座標と同じキャッシュラインに不要なhpやnameの一部も読み込まれます。実際に同時に載る範囲は配列の開始位置とキャッシュライン境界によって異なります。SoAではx・y・zをそれぞれ連続した配列として読み書きでき、座標更新時にhpやnameを読み込まずに済みます。Cygamesの記事は、敵の位置更新処理をこの方向へ組み替えた計測(同記事の表記で Intel Core i-7 3820K 3.3GHz、Visual Studio 2015の/Ox)で、オブジェクト指向設計より3倍程度速く動いたと報告しています。

効果を得やすいのは、同じ処理を大量の要素へ一括で適用する場面です。要素が少なく処理時間も問題になっていないUI部品では、SoA化より保守性を優先し、変更前後の計測で効果を確認します。

Unity ECSに見るゲームエンジンでの実装

DODは個人の手書き最適化から、エンジンの標準機能へ移っています。Unityは2023年6月の公式告知で「ECS for Unity 2022 is now Released and supported for production」と発表し、Entitiesパッケージ1.0系をUnity 2022 LTSで本番利用できる位置づけにしました。ECS(Entity Component System)は、エンティティをIDだけの存在にし、同じ種類のコンポーネントをまとめて格納してシステムが一括処理する構造で、前節のSoAの考え方をエンジン側が引き受けた形です。Unityで大量のオブジェクトを動かす案件なら、自前でSoAを書く前にEntitiesを検討するのが順当です。

データ指向プログラミング(DOP):コードとデータを分離する設計原則

Sharvit本が示す4つの原則

DODと名前は似ていますが、DOPはメモリ配置の話をしません。Yehonathan Sharvit著『データ指向プログラミング』(クイープ訳、翔泳社、2023年4月19日発売、B5変判480ページ、定価3,960円)が扱うのは、ソフトウェアの複雑さを減らすための設計原則です。Sharvit本人のブログ記事「Principles of Data-Oriented Programming」は、原則を次の4つにまとめています。

  • 原則1:コード(振る舞い)をデータから分離する
  • 原則2:データを汎用のデータ構造(マップや配列)で表す
  • 原則3:データを不変として扱う
  • 原則4:データのスキーマをデータの表現から分離する

クラスの内側にデータを隠さず、汎用の構造として外に出し、書き換えではなく新しい値の生成で状態を進める。スキーマ(JSON Schemaなど)は検証のために別に持つ。オブジェクト指向に慣れた開発者ほど抵抗がある4つですが、ClojureやJavaScriptのようにマップを日常的に扱う言語では自然に近い書き方です。

Java 21のrecord・sealed型によるDOPとSharvit本の違い

DOPという語は、Javaの世界でも別系統で使われています。Java言語アーキテクトのBrian Goetzが2022年6月20日にInfoQへ寄稿した「Data Oriented Programming in Java」が起点で、原則の一つ目を「Model the data, the whole data, and nothing but the data.」と表現しました。Sharvit流が汎用のマップで持つのに対し、Java流はrecordでデータを、sealed型で選択肢を表し、パターンマッチで振る舞いを足します。

import java.util.List;

sealed interface Shape permits Circle, Rect {}
record Circle(double r) implements Shape {}
record Rect(double w, double h) implements Shape {}

public class Shapes {
    static double area(Shape s) {
        return switch (s) {
            case Circle(double r) -> Math.PI * r * r;
            case Rect(double w, double h) -> w * h;
        };
    }
    public static void main(String[] args) {
        List<Shape> shapes = List.of(new Circle(1.0), new Rect(2.0, 3.0));
        for (Shape s : shapes) {
            System.out.printf("%s -> %.2f%n", s, area(s));
        }
    }
}

Temurin 25(javac –release 21)で実行すると「Circle[r=1.0] -> 3.14」「Rect[w=2.0, h=3.0] -> 6.00」と出力されます。DOPらしさが出るのは、Shapeに三角形のrecordを足してswitchを直さなかったときです。コンパイルは「the switch expression does not cover all possible input values」で止まります。データの種類が増えたときに、処理の漏れをコンパイラが見つけてくれるわけです。使っている機能が正式機能になった版は、OpenJDKの記録ではrecordがJava 16(JEP 395)、sealed classesがJava 17(JEP 409)、record patternsとswitchのパターンマッチがJava 21(JEP 440・JEP 441)です。Java 21で道具が揃ったことが、この用法の広がりにつながりました。オブジェクト指向側から見たrecordとsealedの使いどころは、オブジェクト指向の三本柱とrecord・sealedの実装手順で扱っています。

データ指向・データ駆動・DOPを取り違えたときの実害

Sharvitは2021年2月16日のブログ記事「Distinction between three data related programming paradigms」で、紛らわしい3つを目的と対象で並べています。

パラダイム 目的 データの扱い
データ指向設計(DOD) 性能を上げる データ配置
データ駆動プログラミング 明快さを上げる 振る舞いをデータで記述
データ指向プログラミング(DOP) 複雑さを減らす データ表現

実務では、DODとDOPの違いが逆向きの指示になって表れます。DODは「データを連続した領域へ詰めて一括で読め」と言い、DOPは「データを不変にして、変更のたびに新しい値を作れ」と言う。永続データ構造は木構造の共有で効率を稼ぐ設計なので、メモリ上の連続性は保証しません。保守性を上げたいチームがSoAへ書き換えるだけでは、状態管理の複雑さが解消するとは限りません。また、ゲームの更新ループで毎回大量のオブジェクトを新規確保する実装に変えると、確保や回収の負荷が増える可能性があります。不変性だけで性能を判断せず、データ構造と更新方法を含めて計測します。名前が似ているだけの別の道具です。

データ指向アプリケーション:信頼性・拡張性・保守性で測る分散システム

レプリケーションとシャーディングという2つの分散方法

3つ目の用法が、Martin Kleppmann『データ指向アプリケーションデザイン』の言うdata-intensive applicationです。オライリー・ジャパンの書籍紹介は「データの量や複雑さ、変化が課題となるアプリケーションを『データ指向』と名づけ」と説明しています。CPU時間ではなくデータが制約になるシステムで、副題のとおり信頼性・拡張性・保守性の3つで設計を評価します。

分散の手段は大きく2つ。同じデータの複製を複数ノードへ置くレプリケーションと、データを分割して別々のノードへ配るシャーディング(パーティショニング)です。前者はノード障害時の可用性と読み取り性能を、後者は単一ノードに収まらない容量と書き込み性能を稼ぎます。両者は排他ではなく、分割したうえで各シャードを複製する構成も取れます。負荷の増加にどこまで台数で対応できるかは、スケーラブル(スケーラビリティ)の考え方として別記事にまとめました。

強い一貫性と結果整合性の選び分け

複製を持った瞬間に、どのノードを読んでも同じ値が返るのかという問題が生じます。強い一貫性(線形化可能性)を合意アルゴリズムで実現する場合、Raftのように過半数のノードへ複製できた時点で書き込みを確定させます。全ノードを待つわけではありませんが、書き込みのたびにノード間の往復が入り、過半数と通信できない間は処理を進められません。レイテンシと可用性を差し出して一貫性を得る設計です。結果整合性は、伝播が終わるまで古い値が読める状態を許容します。

ここは要件で決めます。残高や在庫の引き当てのように二重処理が損害へ直結する処理は強い一貫性へ寄せ、閲覧数の集計やタイムラインの表示は結果整合性で構いません。単一のデータベース内でも、同時更新をどう防ぐかは同じ種類の判断で、楽観ロックと悲観ロックの違いと使い分けがその具体例です。システム全体を一律にどちらかへ倒す設計は、たいてい過剰か不足のどちらかになります。

ストレージエンジンとバッチ・ストリーム処理

Kleppmannの本が分散の話だけで終わらないのは、データベースの内部も同じ物差しで扱うからです。書き込みを追記して後でまとめるLSMツリーは書き込みに強く、ページ単位で上書きするBツリーは読み取りが安定する。行指向と列指向のどちらで格納するかで、トランザクション処理と分析処理の向き不向きが分かれる。さらに、溜まったデータを一括で変換するバッチ処理と、届いたイベントを順に処理するストリーム処理を、どちらも「元データから導出データを作る仕組み」として同じ枠で説明します。製品名ではなく、こうした構造の違いで選べるようになることが本の狙いです。

CQRSとイベントソーシングによる読み書きの分離

読み取りと書き込みで求められる性質が違うなら、モデルごと分けるという選択肢があります。それがCQRS(コマンドクエリ責務分離)で、書き込み側は整合性を守る形に、読み取り側は画面に必要な形に別の構造を持たせます。状態そのものではなく、状態を変えた出来事の履歴を保存するイベントソーシングと組み合わせると、過去の任意時点の状態を再構築できます。第2版ではこの2つが3章の節として扱われるようになりました。Javaでこの構成を組むならAxon Frameworkが実装基盤の候補です。ただし読み取りモデルの遅延と運用コストを持ち込むので、単一のリレーショナルデータベースで足りているうちは採用しないほうが安全です。

オブジェクト指向の対義語として扱われる理由と、その限界

オブジェクト指向との比較軸と3用法の違い

「オブジェクト指向 対義語」「オブジェクト指向 反対」と調べてデータ指向にたどり着く人がいます。ただ、データ指向はオブジェクト指向の対義語ではありません。オブジェクト指向は、データとそれを操作する手続きを1つのクラスへ束ね、外からの直接アクセスを制限します。これがカプセル化です。逆向きに見えるのはDODとDOPの2つで、DODはこの束をメモリ上で分解し、DOPはコードとデータを別の場所へ置きます。データ指向アプリケーションは「データの量・複雑さ・変化が課題になるシステム」という問題の種類を指す言葉で、オブジェクト指向と比べる軸にはありません。DOPについても、Goetzは「When we’re modeling complex entities, OO techniques have a lot to offer us.」と書き、複雑な実体のモデル化にはオブジェクト指向の技法が役立つとしています。1つのシステムの中で使い分ける関係です。なお、プログラミングパラダイムとしてオブジェクト指向と並べられるのは手続き型・関数型が一般的で、データ指向は「何を中心に設計を始めるか」という軸での対比です。

データ指向を採用すべきでない場面

対義語という理解を設計判断へそのまま持ち込むのは行き過ぎです。3つとも、オブジェクト指向を置き換える汎用の代替ではありません。

DOPの「データを汎用の構造で外に出す」方針が裏目に出やすいのは、業務ルールが複雑で、そのルール自体が仕様変更の主戦場になっているシステムです。不変条件を検証する責務の置き場を決めないままデータだけを公開すると、同じチェックが各所に散ります。Goetzが境界での検証と「Make illegal states unrepresentable.」を求めているのはこのためで、それができないならデータを開くべきではありません。この場合はドメイン駆動設計(DDD)のようにモデル側へ責務を集める設計が合います。データ量も同時実行数も小さく単一プロセスで完結するアプリケーションに、分散前提の議論を持ち込む理由もありません。判断の順序は、まず制約がCPU・複雑さ・データ量のどこにあるかを測ってからです。業務システムを新規に組む段階でこの見極めから相談したい場合は、フルスクラッチ開発の設計工程で扱っています。

書籍『データ指向アプリケーションデザイン』初版と第2版の違い

日本語版第2版の書誌(2026年11月5日発行)

原書第2版『Designing Data-Intensive Applications, 2nd Edition』は、O’Reillyの書誌で2026年2月の刊行とされ、Martin KleppmannとChris Riccominiの共著になりました。その日本語版が『データ指向アプリケーションデザイン 第2版 ―信頼性、拡張性、保守性の高い分散システム設計の原理』で、斉藤太郎訳、2026年11月5日発行、664ページ、定価6,930円(税込)、ISBN 978-4-8144-0180-2です。発行元の書籍ページの販売形式は紙のみで、2026年11月1日時点では電子版の価格は載っていません。紹介文は「主要なクラウドサービスがスケーラビリティ、耐障害性、一貫性をどのように実現しているのかを解説します」としており、クラウド前提への書き直しが改訂の中心です。

章立ての変化:3部12章から14章へ

初版は「データシステムの基礎」「分散データ」「導出データ」の3部12章、第2版は部を立てない14章構成です。発行元が公開している両版の目次を突き合わせると、次の違いがあります。

観点 初版(2019年) 第2版(2026年)
冒頭の章 1章 信頼性・スケーラビリティ・メンテナンス性 1章 アーキテクチャのトレードオフ/2章 非機能要件
クラウド 独立した節なし 1.2 クラウドとセルフホスティング
分割の章名 6章 パーティショニング 7章 シャーディング
CQRS 独立した節なし 3.3 イベントソーシングとCQRS
新しい節の例 - ベクトル埋め込み・ローカルファースト・オブジェクトストレージ
最終章 12章 データシステムの将来 13章 ストリーミングの哲学/14章 正しいことをする

章名が「パーティショニング」から「シャーディング」に変わったため、初版の章名で目次を探す場合は対応関係の確認が必要です。第2版にはコラム「シャーディングとパーティショニング」があるので、初版の訳語で覚えた人はそこから読むと混乱しません。ほかにも、4.3.2「ベクトル埋め込み」、5.2.3「耐久性のある実行とワークフロー」、6.2.2「同期エンジンとローカルファーストソフトウェア」、11.2.2「オブジェクトストレージ」など、初版の刊行後に一般化した技術が節として入りました。

初版の入手状況と電子版

初版の日本語版は、Martin Kleppmann著、斉藤太郎監訳、玉川竜司訳、2019年7月18日発行、660ページ、ISBN 978-4-87311-870-3です。2026年11月1日時点で、初版の書籍ページの販売形式欄は「オンライン学習プラットフォーム」だけになっており、オライリー・ジャパンのEbook Storeの全タイトル一覧にも初版は載っていません。初版のPDFを同社から新たに買える状態ではないと考えてください。無償のPDFは正規には配布されていないため、無料配布をうたうファイルには手を出さないことです。初版を持っていて分散システムの基礎を押さえたい段階なら初版で足ります。クラウドのデータウェアハウスやオブジェクトストレージ前提の設計まで追うなら第2版を選ぶ、という分け方が現実的です。

よくある質問

データ指向はオブジェクト指向の対義語ですか?

対義語ではありません。オブジェクト指向がデータと手続きを1つの単位へ束ねるのに対し、データ指向設計はデータをメモリ上で分解し、データ指向プログラミングはデータを振る舞いから分離するので、この2つは逆向きに見えます。一方、データ指向アプリケーションはデータの量・複雑さ・変化が課題となるシステムを指す言葉で、オブジェクト指向と比べる対象ではありません。Goetzも複雑な実体にはオブジェクト指向の技法が役立つとしており、二者択一ではなく使い分ける関係です。

データ指向設計とデータ指向プログラミングは同じものですか?

別物です。データ指向設計(Data-Oriented Design)はCPUキャッシュとメモリ帯域を対象とし、データを連続領域へ配置して一括処理する手法で、ゲームや組込みが主戦場です。データ指向プログラミング(Data-Oriented Programming)はコードとデータの分離や不変データによってソフトウェアの複雑さを減らす設計原則です。Sharvit自身が目的(性能か複雑さか)で両者を区別しています。

Javaのデータ指向プログラミングはSharvitの本と同じものですか?

目的は近いものの、手段が違います。Javaの用法はBrian GoetzがInfoQに寄稿した「Data Oriented Programming in Java」(2022年6月20日)が起点で、recordとsealed型でデータを表し、switchのパターンマッチで振る舞いを足します。Sharvit本は汎用のマップと不変データ構造を使うため、同じDOPという略称でもコードの見た目は別物です。

『データ指向アプリケーションデザイン』の日本語版とPDFはありますか?

日本語版は初版(2019年、ISBN 978-4-87311-870-3)と第2版(2026年11月5日発行、ISBN 978-4-8144-0180-2)の2つです。第2版の発行元ページの販売形式は紙のみで、初版は2026年11月1日時点で同社Ebook Storeの一覧に載っていません。正規の無償PDFは無いため、無料PDFをうたうファイルは避けてください。

データ指向アプリケーションデザインが難しいと言われるのはなぜですか?

660ページ前後の分量で、ストレージエンジンの内部構造、レプリケーション、シャーディング、トランザクション、一貫性と合意、バッチ処理とストリーム処理までを一続きに扱うためです。前提知識が足りない章で止まりやすいので、通読より、担当システムで現に問題になっている章から読む進め方が現実的です。第2版は1章でクラウドとセルフホスティング、分散と単一ノードのトレードオフを先に整理しているので、初めて読むなら第2版のほうが入りやすい構成です。

データ指向型組織(データドリブン)は、この記事のデータ指向と関係ありますか?

直接の関係はありません。データ指向型組織やデータドリブン経営は、意思決定をデータに基づいて行う経営・組織運営の話で、システムの内部設計を指す用語ではないためです。業務分析の「データ中心アプローチ(DOA)」も別系統です。技術文書を探すときは英語表記(Data-Oriented Design/Data-Oriented Programming/Data-Intensive)を添えて検索すると混ざりません。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.29 テックブログ ソニー生命の情報漏洩38.5万件|ログインできない理由、再開状況と窓口の電話番号
  2. 2026.11.03 テックブログ ノジマ不正アクセスで約700万件漏えい:対象確認・窓口と乗っ取り注文を止める実装
  3. 2026.11.03 テックブログ クラブツーリズム不正アクセス:約432万件の対象確認と偽メールの見分け方・流出検知の設計
  4. 2026.11.02 テックブログ サントリーの不正アクセスで約10万人分漏えい|M365のファイル大量ダウンロードを監査ログで調べる手順
  5. 2026.11.02 テックブログ アララの不正アクセス:メール約7,700万件の持ち出しと契約企業が行うAPIキー再設定・代替送信・連名報告

RELATED POSTS 関連記事

目次