問題のあるドメイン
私は、階層データモデルを使用するかなり大きなアプリケーションに取り組んでいます。画像を取得し、画像の特徴を抽出し、これらの上に分析オブジェクトを作成します。したがって、基本モデルはObject-(1:N)-Image_features-(1:1)-Imageのようなものです。ただし、同じ画像セットを使用して、複数の分析オブジェクトを作成できます(オプションが異なります)。
次に、オブジェクトと画像に他の多くの接続されたオブジェクトを含めることができます。たとえば、分析オブジェクトを追加のデータで洗練したり、分析オブジェクトや他のデータに基づいて複雑な結論(ソリューション)を作成したりできます。
現在のソリューション
これはソリューションのスケッチです。スタックはオブジェクトのセットを表し、矢印はポインタを表します(つまり、画像機能はそれらの画像にリンクしますが、その逆はありません)。一部の部分:画像、画像の特徴、追加データは、複数の分析オブジェクトに含まれる場合があります(ユーザーが異なるオブジェクトのセットを異なる方法で組み合わせて分析したいため)。
画像、特徴、追加データ、分析オブジェクトはグローバルストレージ(神オブジェクト)に保存されます。ソリューションは、コンポジションによって分析オブジェクト内に保存されます(そしてソリューション機能が順番に含まれます)。
すべてのエンティティ(画像、画像機能、分析オブジェクト、ソリューション、追加データ)は、対応するクラス(IImageなど)のインスタンスです。ほとんどすべてのパーツはオプションです(つまり、解決策が見つかった後で画像を破棄したい場合があります)。
現在のソリューションの欠点
- スケッチの点線のような接続が必要な場合、この構造をナビゲートするのは面倒です。いくつかのソリューション機能を上部に持つ画像を表示する必要がある場合は、最初に分析オブジェクトを反復処理して、この画像に基づいているものを見つけてから、ソリューションを反復処理して表示する必要があります。
- 1.を解決する場合、点線のリンクを明示的に保存することを選択します(つまり、画像クラスには、それに関連するソリューション機能へのポインターがあります)。これらのポインターの一貫性を維持し、何かが変更されたときにリンクを常に更新することに多大な労力を費やします。 。
私の考え
より拡張性のある(2)柔軟な(1)データモデルを構築したいと思います。最初のアイデアは、オブジェクトとその関係を分離するリレーショナルモデルを使用することでした。そして、ここでRDBMSを使用してみませんか?sqliteは私にとって適切なエンジンのようです。したがって、複雑な関係には、データベース上の単純な(左)JOIN:疑似コード " images JOIN images_to_image_features JOIN image_features JOIN image_features_to_objects JOIN objects JOIN solutions JOIN solution_features
")を使用してアクセスし、IDによってグローバルストレージからソリューション機能の実際のC++オブジェクトをフェッチします。
質問
だから私の主な質問は
- RDBMSを使用することは、私が説明した問題の適切な解決策ですか、それとも価値がなく、アプリで情報を整理するためのより良い方法がありますか?
RDBMSに問題がない場合は、RDBMSとリレーショナルアプローチを使用してC++オブジェクトの関係を格納する方法についてアドバイスをいただければ幸いです。