私は比較的大学を卒業していないので、リレーショナルデータベースに関する私の知識のほとんどは、BCNFまたは3NFにないものはすべてわいせつである私のデータベースコースからのものです。確かにそれは極端なことの一端ですが、仕事中の私のチームは本当にそれを完全に反対側に持っているようです。
マイクロサービスdbスキーマでは、エンティティが複数のテーブルを持つことはめったにありません。通常、別のテーブルに正規化するものはすべてjson列に格納されます。このjsonのプロパティの1つをクエリする必要があることが後で発見された場合、新しい列が追加され、データは両方の場所(はい、同じテーブルの2つの異なる列)に保存されます。
多くの場合、これらのjson列には間違いなく利点があります。そのデータを照会する必要がなく、そのデータに一方的な変更を加える必要がない場合(これは明らかに予測できないことです)、それは悪い考えではありません。さらに、当社のサービスの多くは、サーバーを認識しないか、必要なディスク容量のわいせつなマシンでホストされているため、データの重複は大きな問題ではありません。(私が一般的に哲学から避けたいことですが)
現在、所有する一連の条件に基づいてルールに一致するサービスを構築し、ルールが真(たとえば、すべての条件が真)の場合にそれらのルールに関連付けられた一連のアクションを実行します。このサービスを最も迅速に構築している私のサブチームは、スキーマ内のルールから離れてアクションと条件を正規化することには大きなメリットがあると考えています。明らかに、これらのテーブルは、ルールIDとの外部キー関係を維持します。私たちの観点からは、条件でのデータの重複を避けることができ、一度だけ評価されることを保証できます。また、必要なときに必要な条件やルールを見つけやすく、すべてのルールを引き出してメモリ内で検索する必要がありません。
今日、私たちの主任技術者の一人と話して、彼は私をこのスキーマから遠ざけようとしました。私たちが実際にそれを必要としないとあらゆる方法で議論しようとすると、将来的にパフォーマンスの問題が発生し、所有する古いモノリスを参照します。彼は、私たちがやっていることを「古い方法」と呼び、jsonを含むフラットテーブルを「新しい方法」と呼びました。彼は、私が原子性を望む場所ではそれを必要とせず、クエリの代わりにメモリ内でより多くのことをすべきだと主張した。これは、現在当社のサービスの多くが従っている設計原則です。データの量が大幅に増加することは予想していませんが、これによりクエリを高速に保つことができます。予想されるのは、ルールの評価とアクションの実行に多くの時間を費やすことです。
非リレーショナルデータベースが近年人気を博していることは理解していますが、外部キー関係のパフォーマンスへの影響に関する情報を積極的に検索しても、彼の主張を裏付ける情報は多くありません。問題を引き起こす可能性のある大規模なトランザクションを導入する傾向があると思いますが、それは外部キー自体とは無関係の問題のようです。
これは私の素朴ですか?または、これは本当に私と私のサブチームに欠けているものがありますか?解決策を必ずしも探しているわけではないので、問題に関する詳細な情報を明示的に提供していません。それが私たちの大規模なチームで一般的な傾向であることを考えると、彼らがこれで何かに取り組んでいるかどうかは本当に興味があります。