データストア（データベース）における汎用的な機能分類について

## 概要
データストアの製品選定を行う際に、データストアに求められる機能を分類してみました。
この機能分類を分解していき、製品間で比較することを想定しております。

データストアとは、データベースだけでなく、データレイク（ストレージ）を含めることを想定しております。

私が考えているデータストアとしては、データ分析基盤における概念モデル（リファレンスアーキテクチャ）の下記を含むことを想定しております。

- ストレージ
- オペレーショナルデータストア (ODS)
- データレイク
- データ統合サービス
- データウェアハウス（DWH）【分析データストア（コールドパス）】
- 分析データストア（ホットパス）
- セマンティックデータモデル
- データ仮想化ソリューション
- クエリエンジン

データ分析基盤における概念モデル（リファレンスアーキテクチャ）については下記の記事をご確認ください。

- [最強のデータ分析基盤を目指して～汎用的なデータ分析基盤の選定方法の提案～](https://qiita.com/manabian/private/e689daf5cc006eced737)
- [データ分析基盤における概念モデル（リファレンスアーキテクチャ](https://qiita.com/manabian/private/10a42920cc4eb0a20af0)

## データストアの機能
###　データストアの機能分類 
| #    | 第一分類   | 機能分類             |
| ---- | ---------- | -------------------- |
| A    | 機能要件   | 接続の提供           |
| B    | 機能要件   | メタデータ定義       |
| C    | 機能要件   | データ品質保証       |
| D    | 機能要件   | データ蓄積           |
| E    | 機能要件   | データの問い合わせ   |
| F    | 機能要件   | プログラミング       |
| G    | 機能要件   | オーケストレーション |
| H    | 機能要件   | クエリ最適化         |
| I    | 機能要件   | データ活用           |
| J    | 機能要件   | データ書き込み       |
| K    | 機能要件   | データ取込           |
| V    | 非機能要件 | 運用保守性           |
| W    | 非機能要件 | セキュリティ         |
| X    | 非機能要件 | 拡張性               |
| Y    | 非機能要件 | 回復性               |
| Z    | 非機能要件 | 可用性               |

### データストアの機能詳細
| #    | 第一分類   | 機能分類_1           | 機能分類_2                                                | 機能項目                                                     |
| ---- | ---------- | -------------------- | --------------------------------------------------------- | ------------------------------------------------------------ |
| A010 | 機能要件   | 接続の提供           | エンドポイントの利用                                      | エンドポイントの利用                                         |
| A020 | 機能要件   | 接続の提供           | APIの利用                                                 | ODBCによるデータ処理                                         |
| A030 | 機能要件   | 接続の提供           | APIの利用                                                 | JDBCによるデータ処理                                         |
| A040 | 機能要件   | 接続の提供           | APIの利用                                                 | REST APIによるデータ処理                                     |
| A050 | 機能要件   | 接続の提供           | APIの利用                                                 | SDKによるデータ処理                                          |
| A060 | 機能要件   | 接続の提供           | APIの利用                                                 | CLIによるデータ処理                                          |
| B010 | 機能要件   | メタデータ定義       | DDL(Data Definition Language)                             | DDLの利用                                                    |
| B020 | 機能要件   | メタデータ定義       | サポートしているデータ型                                  | サポートしているデータ型                                     |
| B030 | 機能要件   | メタデータ定義       | 動的スキーマ                                              | 動的スキーマの利用                                           |
| B040 | 機能要件   | メタデータ定義       | データカタログから配信されたスキーマの利用                | データカタログから配信されたスキーマの利用                   |
| B050 | 機能要件   | メタデータ定義       | データベースオブジェクトの定義                            | 複数のインスタンスの定義                                     |
| B060 | 機能要件   | メタデータ定義       | データベースオブジェクトの定義                            | 複数のデータベースの定義                                     |
| B070 | 機能要件   | メタデータ定義       | データベースオブジェクトの定義                            | 複数のスキーマの定義                                         |
| B080 | 機能要件   | メタデータ定義       | データベースオブジェクトの制約                            | マルチバイト文字のオブジェクトでの利用                       |
| B090 | 機能要件   | メタデータ定義       | 外部データストアオブジェクトの定義                        | 外部データストアの参照                                       |
| C010 | 機能要件   | データ品質保証       | 制約の利用                                                | 一意性制約                                                   |
| C020 | 機能要件   | データ品質保証       | 制約の利用                                                | NOT NULL制約                                                 |
| C030 | 機能要件   | データ品質保証       | 制約の利用                                                | 主キー制約                                                   |
| C040 | 機能要件   | データ品質保証       | 制約の利用                                                | 参照整合性（外部キー）制約                                   |
| C050 | 機能要件   | データ品質保証       | 制約の利用                                                | チェック制約                                                 |
| C060 | 機能要件   | データ品質保証       | 制約の利用                                                | エッジ制約                                                   |
| C070 | 機能要件   | データ品質保証       | データプロファイル                                        | データプロファイル                                           |
| D010 | 機能要件   | データ蓄積           | サポートしているデータストアモデル                        | サポートしているデータストアモデル                           |
| D020 | 機能要件   | データ蓄積           | サポートしているデータ保持方針                            | サポートしているデータ保持方針                               |
| D030 | 機能要件   | データ蓄積           | サポートしているトランザクション分離レベル                | サポートしているトランザクション分離レベル                   |
| D040 | 機能要件   | データ蓄積           | サポートしているデータモデルリング技法                    | サポートしているデータモデルリング技法                       |
| D050 | 機能要件   | データ蓄積           | サポートしているデータ形式                                | 構造化データのデータ蓄積                                     |
| D060 | 機能要件   | データ蓄積           | サポートしているデータ形式                                | 半構造化データのデータ蓄積                                   |
| D070 | 機能要件   | データ蓄積           | サポートしているデータ形式                                | 非構造化データのデータ蓄積                                   |
| D080 | 機能要件   | データ蓄積           | データの変更管理                                          | データのバージョニング（タイムトラベル）                     |
| D090 | 機能要件   | データ蓄積           | データの変更管理                                          | 変更データキャプチャ                                         |
| D100 | 機能要件   | データ蓄積           | HTAP（Hybrid transactional/analytical  processing）の対応 | OLTP型データストアにて分析用クエリが利用可能な領域への自動蓄積 |
| E010 | 機能要件   | データの問い合わせ   | クエリ実行方法                                            | SQLによるクエリ実行方法                                      |
| E020 | 機能要件   | データの問い合わせ   | クエリ実行方法                                            | REST APIによるクエリ実行方法                                 |
| E030 | 機能要件   | データの問い合わせ   | クエリ実行方法                                            | GraphQLによるクエリ実行方法                                  |
| E040 | 機能要件   | データの問い合わせ   | クエリ実行方法                                            | SDKによるクエリ実行方法                                      |
| E050 | 機能要件   | データの問い合わせ   | サポートしているデータ形式                                | 構造化データへのクエリ                                       |
| E060 | 機能要件   | データの問い合わせ   | サポートしているデータ形式                                | 半構造化データへのクエリ                                     |
| E070 | 機能要件   | データの問い合わせ   | サポートしているデータ形式                                | 非構造化データへのクエリ                                     |
| E080 | 機能要件   | データの問い合わせ   | 外部データストアへのクエリ                                | 外部データストアへのクエリ実行                               |
| E090 | 機能要件   | データの問い合わせ   | 外部データストアへのクエリ                                | サポートしている外部データストアのファイル形式               |
| F010 | 機能要件   | プログラミング       | ユーザー定義関数                                          | ユーザー定義関数の利用                                       |
| F020 | 機能要件   | プログラミング       | 動的SQL                                                   | 動的SQLの利用                                                |
| F030 | 機能要件   | プログラミング       | ストアードプロシージャ                                    | ストアードプロシージャの利用                                 |
| F040 | 機能要件   | プログラミング       | トリガー                                                  | トリガーの利用                                               |
| F050 | 機能要件   | プログラミング       | ビュー                                                    | ビューの利用                                                 |
| F060 | 機能要件   | プログラミング       | ビュー                                                    | 外部テーブルを含むビューの利用                               |
| F070 | 機能要件   | プログラミング       | 外部APIの利用                                             | 外部REST APIの利用                                           |
| F080 | 機能要件   | プログラミング       | 外部ライブラリーの利用                                    | 外部ライブラリーの利用                                       |
| G010 | 機能要件   | オーケストレーション | パイプライン定義                                          | 他プロセス実行                                               |
| G020 | 機能要件   | オーケストレーション | パイプライン定義                                          | パイプライン定義                                             |
| G030 | 機能要件   | オーケストレーション | プロセスコントロール                                      | パイプライントリガー登録                                     |
| G040 | 機能要件   | オーケストレーション | プロセスコントロール                                      | パイプライン実行ログ保持                                     |
| G050 | 機能要件   | オーケストレーション | プロセスコントロール                                      | パイプラインアラート                                         |
| G060 | 機能要件   | オーケストレーション | プロセスコントロール                                      | パイプライン処理のエラー時の再実行                           |
| H010 | 機能要件   | クエリ最適化         | インデックスの利用                                        | クラスター化インデックスの設定                               |
| H020 | 機能要件   | クエリ最適化         | インデックスの利用                                        | 非クラスター化インデックスの設定                             |
| H030 | 機能要件   | クエリ最適化         | データ保持方法の最適化                                    | 列ストアインデックスの設定                                   |
| H040 | 機能要件   | クエリ最適化         | マテリアルビューの利用                                    | マテリアルビュー（単一テーブルの集計結果を保持）の設定       |
| H050 | 機能要件   | クエリ最適化         | マテリアルビューの利用                                    | マテリアルビュー（複数テーブルの結合後の集計結果を保持）の設定 |
| H060 | 機能要件   | クエリ最適化         | マテリアルビューの利用                                    | マテリアルビュー（外部データストア）の設定                   |
| H070 | 機能要件   | クエリ最適化         | パーティションの利用                                      | 水平的パーティション分割（シャーディング）の設定             |
| H080 | 機能要件   | クエリ最適化         | パーティションの利用                                      | 垂直的パーティション分割の設定                               |
| H090 | 機能要件   | クエリ最適化         | 水平的パーティション分割の設定方法                        | レンジ（範囲）パーティションの設定                           |
| H100 | 機能要件   | クエリ最適化         | 水平的パーティション分割の設定方法                        | リストパーティションの設定                                   |
| H110 | 機能要件   | クエリ最適化         | 水平的パーティション分割の設定方法                        | ハッシュパーティションの設定                                 |
| H120 | 機能要件   | クエリ最適化         | テーブルの分散方法                                        | ラウンドロビン分散テーブル                                   |
| H130 | 機能要件   | クエリ最適化         | テーブルの分散方法                                        | ハッシュ分散テーブル                                         |
| H140 | 機能要件   | クエリ最適化         | テーブルの分散方法                                        | レプリケート テーブル                                        |
| H150 | 機能要件   | クエリ最適化         | リソースの再利用                                          | 結果セットキャッシュの利用                                   |
| H160 | 機能要件   | クエリ最適化         | リソースの最適化                                          | データの統計情報更新                                         |
| H170 | 機能要件   | クエリ最適化         | リソースの最適化                                          | ワークロード管理                                             |
| H180 | 機能要件   | クエリ最適化         | ストレージ最適化                                          | インデックスの最適化                                         |
| H190 | 機能要件   | クエリ最適化         | ストレージ最適化                                          | データ配置の最適化（VACUUM）                                 |
| H200 | 機能要件   | クエリ最適化         | パフォーマンスの自動チューニング                          | インデックスの自動設定                                       |
| H210 | 機能要件   | クエリ最適化         | パフォーマンスの自動チューニング                          | マテリアルビューの自動設定                                   |
| H220 | 機能要件   | クエリ最適化         | パフォーマンスの自動チューニング                          | データの統計情報の自動更新                                   |
| H230 | 機能要件   | クエリ最適化         | パフォーマンスの自動チューニング                          | パーティションの自動設定                                     |
| I010 | 機能要件   | データ活用           | 可視化                                                    | 可視化の実施                                                 |
| I020 | 機能要件   | データ活用           | 統計解析                                                  | 統計解析の実施                                               |
| I030 | 機能要件   | データ活用           | シミュレーション                                          | シミュレーションの実施                                       |
| J010 | 機能要件   | データ書き込み       | データの更新方法                                          | 全件更新                                                     |
| J020 | 機能要件   | データ書き込み       | データの更新方法                                          | 差分更新                                                     |
| J030 | 機能要件   | データ書き込み       | データの更新方法                                          | 増分更新                                                     |
| J040 | 機能要件   | データ書き込み       | データの更新方法                                          | 履歴保持型差分更新                                           |
| J050 | 機能要件   | データ書き込み       | 連携タイミング（レイテンシー）に応じた処理                | バッチ処理により書き込み                                     |
| J060 | 機能要件   | データ書き込み       | 連携タイミング（レイテンシー）に応じた処理                | 準リアルタイムとイベント駆動により書き込み                   |
| J070 | 機能要件   | データ書き込み       | 連携タイミング（レイテンシー）に応じた処理                | リアルタイム（低レイテンシまたはストリーミング）による書き込み |
| J080 | 機能要件   | データ書き込み       | データ書き込みの最適化                                    | データの一括書き込み                                         |
| J090 | 機能要件   | データ書き込み       | データ書き込みの最適化                                    | ストレージからの並列書き込み                                 |
| K010 | 機能要件   | データ取込           | データレプリケーション                                    | トランザクションレプリケーション                             |
| K020 | 機能要件   | データ取込           | データレプリケーション                                    | データ同期                                                   |
| K030 | 機能要件   | データ取込           | 他データストアへのデータ取込                              | 外部ストレージへのエクスポート                               |
| K040 | 機能要件   | データ取込           | 他データストアへのデータ取込                              | ODBCによるデータ取込                                         |
| K050 | 機能要件   | データ取込           | 他データストアへのデータ取込                              | JDBCによるデータ取込                                         |
| K060 | 機能要件   | データ取込           | 他データストアへのデータ取込                              | REST APIによるデータ取込                                     |
| K070 | 機能要件   | データ取込           | 他データストアへのデータ取込                              | CLIによるデータ取込                                          |
| V010 | 非機能要件 | 運用保守性           | 運用支援                                                  | スキーマのバージョン管理                                     |
| V020 | 非機能要件 | 運用保守性           | リリース支援                                              | スキーマの差分反映                                           |
| V030 | 非機能要件 | 運用保守性           | リリース支援                                              | データベース定義の自動差分反映                               |
| V040 | 非機能要件 | 運用保守性           | リリース支援                                              | ソフトウェアのバージョン管理                                 |
| V050 | 非機能要件 | 運用保守性           | パフォーマンス監視                                        | クエリの発行履歴の保持                                       |
| V060 | 非機能要件 | 運用保守性           | パフォーマンス監視                                        | クエリ実行時のリソース利用情報の保持                         |
| V070 | 非機能要件 | 運用保守性           | パフォーマンス監視                                        | クエリ実行時の実行計画の保持                                 |
| V080 | 非機能要件 | 運用保守性           | パフォーマンス監視                                        | パフォーマンスに関するアラート                               |
| W010 | 非機能要件 | セキュリティ         | 認証                                                      | 基本認証の利用                                               |
| W020 | 非機能要件 | セキュリティ         | 認証                                                      | 多要素認証の実施                                             |
| W030 | 非機能要件 | セキュリティ         | 認証                                                      | 多段階認証の実施                                             |
| W040 | 非機能要件 | セキュリティ         | 認証                                                      | 外部IDサービスの利用                                         |
| W050 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | SQL命令（DDL、DCL）相当に対する実行の権限付与                |
| W060 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | オブジェクト（スキーマ）一覧の閲覧の権限付与                 |
| W070 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | 子オブジェクトへの継承の権限付与                             |
| W080 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | データ参照の権限付与                                         |
| W090 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | データ挿入・更新・削除の権限付与                             |
| W100 | 非機能要件 | セキュリティ         | データストアシステムへの権限付与                          | データストアに対するデータアクセス者の認証による権限付与     |
| W110 | 非機能要件 | セキュリティ         | データへの権限付与                                        | ルールベースによる行レベルセキュリティ                       |
| W120 | 非機能要件 | セキュリティ         | データへの権限付与                                        | データ権限（認可）テーブルを利用した行レベルセキュリティ     |
| W130 | 非機能要件 | セキュリティ         | データへの権限付与                                        | 列への参照権限付与による列レベルセキュリティ                 |
| W140 | 非機能要件 | セキュリティ         | データへの権限付与                                        | 永続データマスキングによる列レベルセキュリティ               |
| W150 | 非機能要件 | セキュリティ         | データへの権限付与                                        | 動的データマスキングによる列レベルセキュリティ               |
| W160 | 非機能要件 | セキュリティ         | 物理的なセキュリティ                                      |                                                              |
| W170 | 非機能要件 | セキュリティ         | 監視                                                      | 監査ログデータの生成                                         |
| W180 | 非機能要件 | セキュリティ         | 境界                                                      | セキュリティ監視サービスの利用                               |
| W190 | 非機能要件 | セキュリティ         | ネットワーク                                              | ファイヤーウォールの設定                                     |
| W200 | 非機能要件 | セキュリティ         | アプリケーション                                          |                                                              |
| W210 | 非機能要件 | セキュリティ         | データ                                                    | データの暗号化                                               |
| X010 | 非機能要件 | 拡張性               | データ容量の拡張                                          | データ容量の拡張                                             |
| X020 | 非機能要件 | 拡張性               | 同時実行数                                                | 同時実行数                                                   |
| X030 | 非機能要件 | 拡張性               | コンピューティングリソースの拡張                          | スケールアップ （垂直方向のスケーリング）                    |
| X040 | 非機能要件 | 拡張性               | コンピューティングリソースの拡張                          | ノードのスケールアウト （水平方向のスケーリング）            |
| X050 | 非機能要件 | 拡張性               | コンピューティングリソースの拡張                          | クラスターのスケールアウト （水平方向のスケーリング）        |
| X060 | 非機能要件 | 拡張性               | コンピューティングリソースの拡張                          | コンピューティングリソースのマルチ化                         |
| Y010 | 非機能要件 | 回復性               | 偶発的なリソース削除への対応                              | 偶発的なリソース削除への対応                                 |
| Y020 | 非機能要件 | 回復性               | データセンターの一部に対する障害対応                      | データセンターの一部に対する障害対応                         |
| Y030 | 非機能要件 | 回復性               | データセンター全体に対する障害対応                        | データセンター全体に対する障害対応                           |
| Y040 | 非機能要件 | 回復性               | バックアップ                                              | 自動バックアップ                                             |
| Y050 | 非機能要件 | 回復性               | バックアップ                                              | 手動バックアップ                                             |
| Y060 | 非機能要件 | 回復性               | バックアップ                                              | バックアップファイルのエクスポート                           |
| Y070 | 非機能要件 | 回復性               | バックアップ                                              | バックアップからの復元                                       |
| Y080 | 非機能要件 | 回復性               | バックアップ                                              | ポイントインタイムリストア                                   |
| Z010 | 非機能要件 | 可用性               | 可用性の最適化                                            | フォールトレランス                                           |
| Z020 | 非機能要件 | 可用性               | サービスレベルアグリーメント                              | サービス レベル アグリーメント                               |
| Z030 | 非機能要件 | 可用性               | 計画的なメンテナンスへの対応                              | 計画的なメンテナンスへの対応                                 |
| Z040 | 非機能要件 | 可用性               | データセンターの一部に対する障害対応                      | データセンターの一部に対する障害対応                         |
| Z050 | 非機能要件 | 可用性               | データセンター全体に対する障害対応                        | データセンター全体に対する障害対応                           |

## 前提知識
### データストアモデル一覧
| #    | データストアモデル           |
| ---- | ---------------------------- |
| 1    | リレーショナル型データベース |
| 2    | キーバリュー型データベース   |
| 3    | ドキュメント型データベース   |
| 4    | グラフ型データベース         |
| 5    | データ分析型データベース     |
| 6    | 列指向型データベース         |
| 7    | 検索エンジン型データベース   |
| 8    | 時系列データベース           |
| 9    | 空間データベース             |
| 10   | オブジェクトストレージ       |
| 11   | ファイル共有ストレージ       |

### データモデル一覧
| #    | データモデル                          |
| ---- | ------------------------------------- |
| 1    | リレーショナルモデリング（3NF）       |
| 2    | データヴォールトモデリング（DV）      |
| 3    | ディメンションナルモデリング（DM）    |
| 4    | 第一正規形（大福帳）モデリング（1NF） |
| 5    | NoSQL                                 |

### データ保持方針
| #    | データの保持方針               | 説明                                                         | 代表的なサービス     |
| ---- | ------------------------------ | ------------------------------------------------------------ | -------------------- |
| 1    | メモリとストレージの最適利用型 | データをシステムが管理しているストレージに保持しておき、必要に応じてメモリに展開して処理する方法。 | PostgreSQL、Spark    |
| 2    | OLTP最適化インメモリ型         | データの書き込みとデータの読み込みに最適化できるようにデータをメモリに保持しておき処理する方法。 | SAP HANA、Redis      |
| 3    | クエリ最適化インメモリ型       | データの読み込みに最適化できるようにデータをメモリに保持しておき処理する方法。 | Power BIデータセット |
| 4    | ストレージ集中型               | データをストレージに保持しておき、最小減のメモリのみ利用するように、中間結果をストレージに保存しながら処理する方法。 | Hadoop               |

### データ処理の類型
| #    | データ処理分類     | データ処理分類                            | 説明                                                         |
| ---- | ------------------ | ----------------------------------------- | ------------------------------------------------------------ |
| 1    | データ抽出         | データ抽出                                | ソースのデータストアからデータを抽出する処理。               |
| 2    | データ変換         | データ変換                                | データを変換する処理。                                       |
| 3    | データ変換         | データのメタデータ変換                    | データのメタデータ（データ型、データの構造化等）を実施する処理。 |
| 4    | データ変換         | データのフィルタリング                    | 指定の条件のみのデータに変換する処理。                       |
| 5    | データ変換         | データの並び替え                          | データの並び替えを実施する処理。                             |
| 6    | データ変換         | データの結合                              | 複数のデータを結合する処理。                                 |
| 7    | データ変換         | データの集計                              | データを集計する処理。                                       |
| 8    | データ変換         | データのユニオン                          | データをユニオンする処理。                                   |
| 9    | データ変換         | 分析関数（Parttition BY句相当機能）の利用 | 分析関数（Parttition  BY句相当機能）を利用する機能。         |
| 10   | データ変換         | データクレンジング                        | 現在のデータの品質を改善する処理                             |
| 11   | データ変換         | データ強化                                | 参照データとのマッピングや変換仕様の実装を行うことで、データの付加によるデータの品質を改善する処理。 |
| 12   | データ取込         | データ取込                                | ターゲットのデータストアにデータを取り込む処理。             |
| 13   | データの問い合わせ | データの問い合わせ                        | 内部で管理しているストレージからデータを読み込む処理。       |
| 14   | データ書き込み     | データ書き込み                            | 内部で管理しているストレージにデータを書き込む処理。         |