私のアプリケーションは、データベースから複雑なデータ構造に大量のデータをロードします。インメモリデータ構造はデータベースの構造に似ています。つまり、データベースに次のテーブルが含まれている場合:
- テーブルA、キーはA1です
- テーブルB、キーはB1、列の1つはテーブルAの[キー]への外部キーです
- テーブルC、キーはC1、列の1つはテーブルBの[キー]への外部キーです
次に、クラスA、B、Cがあり、次のようになります。
- Bのデータメンバー(B :: m_a)はAへのポインタです
- Cのデータメンバー(C :: m_b)はBへのポインターです
これは、データベースをロードする場合、正しい順序でロードする必要があることを意味します。最初にCをロードすると、ポイントする必要のあるインスタンスがロードされていないため、値C::m_bを設定できないというメッセージが表示されます。
問題は、他のテーブルの1つ(たとえばC)への外部キーである列もAにある場合です。
すべての外部キーを文字列としてロードし、すべてのデータがロードされた後にルックアップを実行することで問題を解決できますが、何百万ものレコードをロードしなければならないことがあるため、これらにメモリを費やす余裕はありません(一時的ではありますが) )文字列。
優れた設計(たとえば、「大規模C ++ソフトウェア設計」という本)について読んだことがあるので、循環参照を使用するのは悪い考えだと思います。たとえば、ファイルXHにYHが含まれているが、YHにもXHが含まれている場合は、設計が不適切である可能性があります。クラスXがクラスYに依存している場合、またはその逆の場合は、設計が不適切である可能性があります。この依存関係を抽出し、XとYに依存する3番目のクラスZを導入することで解決する必要があります(XとYは相互に依存しなくなります) 。
このデザインルールをデータベースデザインにも拡張するのは良い考えですか?言い換えれば、外部キーの循環参照を防ぐことです。