MongoDB を使用する場合、参照データの非正規化はかなり一般的な方法のようです。それでも、Doctrine MongoDB ODM でそれを処理する組み込みの方法は見当たりません。
ユーザーが相互にフォローできるソーシャル ネットワークがあるとします。ここに 2 つのユーザーの例を示します。
{
_id : id1,
name: "Malcolm Reynolds",
followed: []
}
{
_id : id2,
name: "Zoe Alleyne",
followed: [
{ _id: id1, name: "Malcolm Reynolds" }
]
}
ご覧のとおり、「name」プロパティを非正規化する必要があります。私が言ったように、Doctrine ODM にはそれを行う組み込みの方法はないようです。この件に関する最新号は1 年前のものなので、自分でやろうと思います。
非正規化がどのような場合に役立つかを説明し、非正規化されたデータの一貫性を維持するのがいかに面倒であるかについて言及している記事をインターネット上でたくさん見つけましたが、正規化されていないデータの更新プロセスを実装する方法を説明する記事は見つかりませんでした。
私の場合、最終的に一貫性のあるデータで十分です。ユーザー名の更新と非正規化されたデータの更新の間に数時間かかることがあります。私はそれを行う3つの異なる方法を見ることができます:
1 - 整合性チェッカー: 非正規化データを定期的に更新するタスクをバックグラウンドで実行します。
2 - トリガーの更新: 名前フィールドを更新するたびに、関連するすべての非正規化データが 1 回のフラッシュで更新されます。
3 - ハイブリッド ソリューション 各ユーザーについて、名前が更新されると、更新情報と共にエントリがキューに追加され (ユーザーの更新とキューへの挿入は 1 回のフラッシュで行われます)、タスクが実行されます。バックグラウンドで実際の更新を行います。
最初の解決策は実装が最も簡単に思えますが、リソースを大量に消費する可能性があります。2 番目の解決策では、読み取り/書き込み比率が高くても、更新要求が途方もなく長くなり、これが問題になる可能性があります。3番目の解決策が進むべき道だと思いますが、そう考えるのは正しいですか?
また、データが非正規化されている各ドキュメントの preUpdate コールバックで同じコードを書き直す必要がないようにするなど、DRY の方法でそれを行いたいと考えています。カスタム注釈を作成することを考えていますが、それは良い考えですか?