第10章: データベース技術
この章を読む理由
解析結果を再利用可能な資産に変えるには、 ファイルを置くだけでなく、スキーマ、索引、追跡可能性、権限制御を設計する必要があります。 第10章は、第4章と第7章で得た成果物を 「チームで使えるデータ基盤」へ変換するための章です。
本章で使う共通題材
- 題材A: SARS-CoV-2 公開データ
SRR11140744/MN908947.3- 変異結果や時系列監視データをどう保存するかを考えます。
- 題材B: TCGA-LUAD 研究用ミニケース
TCGA-LUAD- 発現行列・変異情報・臨床メタデータを統合する研究用データマートの最小例として扱います。
学習目標
- 生物学データの保存戦略を、リレーショナル / NoSQL / データウェアハウスの観点で比較できる
genomic_variantsやsample_metadataのような最小スキーマを設計し、索引とクエリ計測の考え方を説明できる- データ由来、更新履歴、権限制御を含む追跡可能性の設計を整理できる
10.0 DB/API由来データを保存対象にする前提
10.0.1 DB/APIを保存対象にする前の確認事項
第10章では、データベースを「高速に検索する仕組み」だけでなく、外部DB・APIから取得したデータを再利用可能な資産に変えるための設計対象として扱います。NCBI Datasets CLI / API、Entrez / E-utilities、Ensembl REST、UniProt REST、GA4GH標準などの使い分けは 付録I-2 で、API rate limit、retry、cache、provenance / 来歴の実装前チェックは 付録I-5 で扱います。
| 設計観点 | 第10章で決めること | 保存・監査で残す項目 |
|---|---|---|
| 識別子 | accession、stable ID、gene symbol、sample ID のどれを主キーまたは外部キーにするか | accession.version、DB名、DB release、genome build、ID mapping の実行日 |
| 取得経路 | CLI一括取得、REST API照会、bulk download、GA4GH実装のどれを使うか | endpoint、query、パラメータ、取得日時、レスポンス形式、terms of use |
| データ品質 | 取得値をそのまま入れるか、検証済みテーブルへ昇格するか | checksum、row count、欠損率、filter条件、review status / evidence level |
| 更新設計 | full refresh、incremental update、snapshot固定のどれにするか | snapshot ID、更新者、更新理由、差分件数、ロールバック手順 |
| API信頼性 | timeout、retry、backoff、cache、rate limit をどこで制御するか | HTTP status、retry回数、cache hit率、429/503発生数、失敗時の再実行手順 |
| 責任境界 | 研究・教育用途、解析支援、臨床実装のどこまで扱うか | 用途区分、権限、監査ログ、臨床判断に使わない注記、専門家レビューの要否 |
この章のスキーマ例では、解析結果そのものだけでなく、analysis_run、source_dataset、reference_version、api_request_log のようなメタデータを別テーブルまたは別コレクションとして設計します。これにより、同じ variant / 変異や発現値を後から読み直すときに、「どのDB releaseを、どの経路で、どの条件で取得した値か」を説明できます。
10.1 保存先の選択(DB / Parquet / object storage / データウェアハウス)
最初に決めるのは製品名ではなく、保存対象の粒度、更新頻度、同時利用者、再解析時に説明したい provenance / 来歴です。小規模な検証では単一ファイルのDBや列指向ファイルで十分な場合があります。一方、複数人が更新する共有基盤では、トランザクション、権限、バックアップ、監査ログを備えたRDBを優先します。
| 保存先 | 向く場面 | 第10章で設計すること |
|---|---|---|
| SQLite | 1人または少人数で扱うサンプルメタデータ、演習用の小規模variant / 変異テーブル | DBファイルのchecksum、schema version、作成スクリプト、再生成手順 |
| PostgreSQL | チームで共有する sample_metadata、genomic_variants、analysis_run、source_dataset |
主キー・外部キー、索引、権限、バックアップ、監査ログ、スキーマ変更手順 |
| DuckDB + Parquet | 発現行列、注釈テーブル、集計済みvariant一覧など、読み取り中心の列指向分析 | Parquetファイルの分割単位、列型、manifest、row count、checksum、生成クエリ |
| Object storage + manifest | DB/APIから取得したsnapshot、再解析用の中間成果物、共有する参照データ | パス命名規則、version固定、lifecycle、アクセス権、source_dataset との対応 |
| 分散DB / データウェアハウス | 多人数・多部門で横断集計する場合や、単一RDBでは計測上の限界が明確な場合 | コスト、データ転送、権限境界、更新単位、ロールバック、監査証跡 |
実務では、次の順で候補を絞ります。
- snapshot固定か継続更新か: 研究・教育用の再現性を優先するなら、DB release、取得日、checksumを固定したsnapshotを作ります。継続更新する場合は、差分件数、更新理由、ロールバック手順を
analysis_runに残します。 - 行指向か列指向か: サンプル単位の検索や更新が中心ならRDB、列を絞った集計や発現行列の横断分析が中心ならParquetのような列指向保存を検討します。
- 同時更新と権限が必要か: 1人の検証ではSQLiteやDuckDBで始め、複数人が更新する段階でPostgreSQLなどの共有RDBへ移します。
- provenanceをどこに置くか: 生データ、整形済みテーブル、API request log、checksum確認表を分け、
source_datasetとreference_versionから追跡できるようにします。
分散DBや専用データウェアハウスは、大規模データを扱うための選択肢です。ただし、最初から大規模基盤を前提にすると、schema version、取得元、checksum、権限境界のような基本設計が曖昧になることがあります。まず小さな題材で、保存先ごとの成果物と運用責任を説明できる状態にしてから拡張します。
10.1.1 インデックス最適化とクエリ計測(PostgreSQL)
RDBの索引設計では、variant / 変異テーブル単体の検索速度だけでなく、検索結果から取得元データセットと解析実行へ戻れるかも計測対象にします。source_dataset と analysis_run へのJOINを典型クエリに含めておくと、性能改善とprovenance / 来歴の説明責任を同時に確認できます。
以下は PostgreSQL での索引設計とクエリ計測の観点を示す SQL 断片です。genomic_variants / source_dataset / analysis_run のテーブル定義、制約、サンプルデータ、権限設定を省略しているため、そのままでは実行できません。
🧪 概念例(実行不可: テーブル定義・サンプルデータを省略した PostgreSQL の SQL 断片)
-- 代表的な索引の作成(位置・染色体・サンプルID)
CREATE INDEX IF NOT EXISTS idx_variants_chr_pos
ON genomic_variants (chromosome, position);
CREATE INDEX IF NOT EXISTS idx_variants_sample
ON genomic_variants (sample_id);
-- provenance / 来歴をたどる外部キー列も、典型クエリに合わせて索引化
CREATE INDEX IF NOT EXISTS idx_variants_source_chr_pos
ON genomic_variants (source_dataset_id, chromosome, position);
CREATE INDEX IF NOT EXISTS idx_variants_analysis_run
ON genomic_variants (analysis_run_id);
CREATE INDEX IF NOT EXISTS idx_source_dataset_release
ON source_dataset (source_dataset_id, db_release);
-- 範囲検索と取得元・解析実行の確認を同じクエリで計測
-- source_dataset_id は、表示名ではなく snapshot 単位で固定したIDを想定
EXPLAIN (ANALYZE, BUFFERS)
SELECT v.variant_id, v.chromosome, v.position, v.sample_id,
s.dataset_name, s.db_release, a.pipeline_version
FROM genomic_variants AS v
JOIN source_dataset AS s ON v.source_dataset_id = s.source_dataset_id
JOIN analysis_run AS a ON v.analysis_run_id = a.analysis_run_id
WHERE v.source_dataset_id = 'tcga_luad_snapshot'
AND v.chromosome = '1'
AND v.position BETWEEN 1000000 AND 2000000
AND s.db_release = 'fixed_db_release';
-- 欠損の多い列には部分索引も検討
CREATE INDEX IF NOT EXISTS idx_variants_quality_notnull
ON genomic_variants (quality) WHERE quality IS NOT NULL;
ヒント:
- パーティションプルーニングを活かすため、パーティションキー(例: 染色体)を絞り込む述語を必ず含める。
EXPLAIN (ANALYZE, BUFFERS)の結果を比較し、テーブルスキャン→インデックススキャンへの切替を確認。source_datasetやanalysis_runとのJOINを典型クエリに含め、検索結果から取得元DB、DB release、pipeline version に戻れることを確認。dataset_nameのような表示名だけで絞らず、snapshot単位で固定したsource_dataset_idとDB releaseを条件に含める。- 統計更新(
ANALYZE)とワークメモリ・並列設定でプランの改善余地を検討。 - 索引変更の理由、対象snapshot、計測日時、主要クエリ、実行計画の要約を
analysis_runまたは運用ログに紐づけて残す。
10.2 NoSQLデータベースを使う条件
NoSQL は、RDB を置き換える万能な保存先ではありません。使う前に、データ構造が頻繁に変わるのか、関係をたどる検索が中心なのか、時系列の追記が中心なのかを切り分けます。sample_metadata や analysis_run のように整合性と外部キーが重要なデータはRDBを基本にし、NoSQLは構造やアクセスパターンがRDBだけでは扱いにくい部分へ限定して使います。
| パターン | 向く場面 | 避ける条件 | provenance / 来歴で残すこと |
|---|---|---|---|
| ドキュメントDB | DB/APIから取得した注釈JSON、gene / transcript / variant annotation のようにフィールドが増減するデータ | 主キー・外部キー・一意制約で整合性を厳密に守りたい中核テーブル | 取得元DB、DB release、schema version、変換前JSONのchecksum、正規化した列との対応 |
| グラフDB | 遺伝子ネットワーク、pathway、variant-gene-drug の関係など、経路探索や近傍探索が中心のデータ | 単純な集計、範囲検索、定型レポートが中心のデータ | node / edge の由来、関係タイプ、根拠DB、取り込み日、削除・統合ルール |
| Wide-column / 時系列系 | 実験時刻、観測点、バッチ単位で追記される測定値やログ | 小規模で複雑なJOINが必要な解析用データ | partition key、timestamp基準、集計粒度、欠測処理、保持期間 |
| Key-value / cache | API応答の短期cache、ID mapping結果、rate limitを避けるための再利用 | 再現性の根拠として長期保存する唯一の原本 | cache key、TTL、HTTP status、ETag / Last-Modified 相当の情報、再取得条件 |
NoSQL を採用する場合でも、解析の起点になる source_dataset、reference_version、analysis_run はRDBやmanifestで追跡できるようにします。たとえば、注釈JSONをドキュメントDBに置く場合でも、どの accession.version とDB releaseから作った文書かをRDB側に残し、再生成できる経路を確保します。
採用を避ける目安も明確にします。表形式で扱える小規模データを「将来大きくなるかもしれない」という理由だけでNoSQL化すると、JOIN、制約、監査、バックアップの設計が複雑になります。まずRDBまたはParquetで表現し、検索パターンが明確になってから必要な部分だけNoSQLへ分離します。
10.3 データウェアハウスと研究用データマート
データウェアハウスは、外部DB/APIから取得した原本を置く場所ではなく、解析・集計・共有のために整形した派生データを置く場所として設計します。第10章では、大規模な商用DWH製品名よりも、raw snapshot、staging、curated data mart、aggregate の層を分け、それぞれに provenance / 来歴を残すことを重視します。
| 層 | 置くもの | 主な保存形式 | 残す確認項目 |
|---|---|---|---|
| Raw snapshot | DB/APIから取得した元ファイル、レスポンス、metadata | object storage、圧縮ファイル、取得ログ | 取得URL、DB release、取得日時、checksum、terms of use |
| Staging | 型変換・列名整理後の中間テーブル | Parquet、CSV、作業用RDB | row count、欠損率、変換スクリプト、schema version |
| Curated data mart | 解析者が使う sample, variant, expression, annotation などの表 |
RDB、Parquet、DuckDB | 主キー、外部キー、索引、source_dataset との対応 |
| Aggregate / reporting | QC集計、サンプル別件数、可視化用サマリ | 集計テーブル、dashboard用extract | 集計日、集計条件、入力snapshot、再計算手順 |
ETL / ELT は、単なる「抽出・変換・格納」ではなく、どの段階でデータを信頼できる形へ昇格させるかを決める作業です。たとえば TCGA-LUAD の研究用ミニケースでは、発現行列、変異情報、臨床メタデータを1つの巨大テーブルにまとめるのではなく、サンプルID、測定種別、由来DB、利用条件を分けて持つ data mart を作ります。
DWH や data mart を設計するときは、次の境界を明記します。
- 原本と派生物の境界: raw snapshot と curated table を分け、派生物だけを見ても元データの accession.version、DB release、checksum に戻れるようにします。
- 分析用と監査用の境界: 解析者向けの集計テーブルとは別に、
analysis_run、source_dataset、reference_version、api_request_logを監査用に残します。 - 更新と再計算の境界: full refresh と incremental update のどちらで更新するかを決め、差分件数、失敗時のロールバック手順、再計算の起点を記録します。
- 利用条件の境界: 公開DB/API由来のデータでも、利用条件、再配布可否、商用利用可否が異なる場合があるため、data mart の列やmanifestに用途区分を残します。
この設計により、DWH は「すべてを入れる場所」ではなく、研究・教育用途の再解析と説明責任を支える読み取り最適化層になります。臨床判断や個人情報を扱う場合の追加要件は、第11章と第12章で扱います。
まとめ
- DB 章の要点は、性能だけでなく「どの成果物を、どの粒度で、誰が再利用するか」を先に決めることです。
SRR11140744の変異結果やTCGA-LUADの研究データを例に、 スキーマ、索引、保存先、由来情報に加えて、accession.version、DB release、genome build、checksum、取得日時を一緒に設計すると後続章で再利用しやすくなります。- RDB、Parquet、object storage、NoSQL、DWH は物理的な保存先や実行基盤として整理し、raw snapshot、staging、curated data mart、aggregate / reporting は論理層として分けて設計します。
- DB/API 由来データを保存する場合は、
source_dataset、reference_version、analysis_run、api_request_logを成果物に含めると、後から「どの取得元を、どの条件で、どの処理に使ったか」を説明できます。 - 第11章では、この基盤設計を前提に、個人情報・同意・監査ログの扱いへ進みます。
Source notes / 次の一歩
次章への橋渡し
データを保存できるだけでは、医療・研究現場では使えません。 次章では、同じデータ基盤を前提に、匿名化、権限管理、監査ログ、 フェデレーテッド学習といったプライバシー保護の観点を重ねます。
最小入出力(期待成果物/期待ログ)
- 入力: 対象データのスキーマ(例: 変異・注釈・サンプル)、サンプルデータ(小規模で可)、accession.version 付きID、DB/API取得元、
reference_version(genome build 例: GRCh38 などを含む)、DB release または snapshot ID - 出力(期待成果物): 保存先・実行基盤選択メモ(RDB / Parquet / object storage / NoSQL / DWH)、インデックス/パーティショニング方針、主要クエリの設計メモ、raw snapshot / staging / curated data mart / aggregate の層定義、
source_dataset、reference_version、analysis_run、api_request_logの項目定義、checksum / row count 確認表 - 期待ログ(例): クエリ性能の計測結果(例:
EXPLAIN ANALYZE、実行時間)、取得URL / API endpoint、query、HTTP status、retry / cache の記録、層ごとの row count、checksum / row count の検証結果、更新時の差分件数とロールバック手順が残る
| 前へ: 集団ゲノミクス | 目次 | 次へ: プライバシー保護技術 |
演習
genomic_variants、sample_metadata、source_dataset、analysis_runの 4 テーブルを持つ最小スキーマを設計し、主キー・外部キー・索引方針と保存先(RDB / Parquet / object storage)を示せ。SRR11140744またはTCGA-LUADを題材に、raw snapshot、staging、curated data mart、aggregate / reporting の 4 層を定義し、各層の row count、checksum、manifest 項目を示せ。- 外部DB/APIから取得した注釈を保存する想定で、RDB、ドキュメントDB、Key-value / cache のどれを使うかを判断し、
api_request_logに残す endpoint、query、取得日時、HTTP status、retry回数、cache有無、checksum を定義せよ。 - 研究用途と将来の臨床連携検討を分けるために、権限、監査ログ、データ保持期間、専門家レビューの要否をどう切り分けるか整理せよ。
具体課題例
- 変異結果を RDB へ格納する案、注釈 JSON をドキュメント DB へ格納する案、集計済み Parquet を DuckDB で読む案を比較する。
- データ更新時に必要なメタデータ(accession.version、DB release、genome build、checksum、参照配列 ID、ツール版、実行日、責任者、ロールバック手順)を列として設計する。
- NCBI Datasets / Entrez、UniProt REST、Ensembl REST などから注釈を取得する場合に、取得経路、利用条件、API version、rate limit、retry / cache 方針を列挙する。
TCGA-LUADの研究用データマートを例に、sample、variant、expression、annotationの表を分け、source_datasetとの対応を示す。- 第12章で臨床ゲノム情報の責任境界を検討する前提として、どの列を匿名化 / 仮名化対象にするかメモを作る。