過去20年にわたって、いくつかの大規模なモジュラーデータベース設計を見てきました。また、アプリケーションが独自のスキーマ/テーブルセットへの書き込みアクセスと、別のスキーマ/テーブルのセット。ほとんどの場合、アプリケーション/モジュールが読み取り専用アクセスを取得するこのデータは、「マスターデータ」と呼ばれます。
その間、以前の回答で見たはずの問題が見られなかったので、以前の回答で指摘されたポイントをより詳しく見る価値があると思います。
シナリオ:いくつかのコンポーネントをRDBMSに直接結び付け、特定のコンポーネントがパフォーマンスのボトルネックになる
これは、マイクロサービスが読み取るためのデータのコピーをローカルに保持するための引数でもあることを除き、このコメントに同意します。つまり、ほとんどの成熟したデータベースは複製をサポートしているため、開発者の努力なしに、「マスターデータ」をマイクロサービスデータベースに物理的に複製することができます。
コアテーブルを「部門データベース」に複製する「エンタープライズデータベース」として古い装いでこれを認識する人もいます。ここでのポイントは、一般に、変更されたデータ(バイナリ形式で、ソースデータベースへの最小限のコストで)の組み込みレプリケーションを使用してデータベースがこれを行うと良いことです。
逆に、データベースの選択でこの「既製」のレプリケーションサポートが許可されていない場合、「マスターデータ」をマイクロサービスデータベースにプッシュしたい状況に陥り、開発者の多大な労力とまた、実質的に効率の低いメカニズムでもあります。
データベースの非正規化が必要かもしれませんが、他のすべてのコンポーネントが影響を受けるため、できません。
私にとって、この発言は正しくありません。非正規化は「相加的な」変更であり、「重大な変更」ではなく、非正規化によりアプリケーションが破損することはありません。
これがアプリケーションを中断する唯一の方法は、アプリケーションコードが「select * ...」のようなものを使用し、余分な列を処理しない場合です。私にとってそれはアプリケーションのバグでしょうか?
非正規化はどのようにアプリケーションを破壊できますか?私にはFUDのように聞こえます。
スキーマの依存関係:
はい、アプリケーションは現在データベーススキーマに依存しているため、これは大きな問題になるはずです。余分な依存関係を追加することは明らかに理想的ではありませんが、私の経験では、データベーススキーマへの依存関係は問題ではなかったので、なぜそうなるのでしょうか?運が良かっただけですか?
マスターデータ
通常、マイクロサービスに読み取り専用アクセスを許可するスキーマは、最も一般的には企業の「マスターデータ」と呼んでいます。企業に不可欠なコアデータがあります。
歴史的に、これは、依存関係を追加するスキーマが成熟し、安定していることを意味します(企業にとって基本的であり、変化しません)。
正規化
3人のデータベース設計者が行って正規化されたdbスキーマを設計すると、同じ設計になります。わかりました、4NF / 5NFのバリエーションがあるかもしれませんが、それほど多くありません。さらに、デザイナーがモデルを検証するために尋ねることができる一連の質問があり、デザイナーは4NFに到達したことを確信できます(私も楽観的ですか?4NFに到達するのに苦労していますか?)。
更新:によって4NFここで私は、スキーマ内のすべてのテーブルは、(すべてのテーブルが4NFまで適切に正規化されてしまった)4NFまでの彼らの最高の正常な形になったわけ。
正規化設計プロセスは、データベース設計者が正規化されたデータベーススキーマに依存するという考え方に一般的に満足している理由だと思います。
正規化のプロセスにより、DB設計は既知の「正しい」設計になり、そこからのバリエーションはパフォーマンスのために非正規化されるはずです。
- サポートされているDBタイプ(JSON、ARRAY、Geoタイプのサポートなど)に基づいてバリエーションがあります。
- 4NF / 5NFに基づくバリエーションを主張する人もいます
- 物理的な変動を除外します(問題ではないため)
- これはDW設計ではなくOLTP設計に制限されます。これは、これらが読み取り専用アクセスを許可するスキーマであるためです。
3人のプログラマーが(コードとして)実装するデザインを与えられた場合、3つの異なる実装(潜在的に非常に異なる)が期待されます。
私には、「正規化への信仰」という疑問が潜在的にあります。
スキーマの変更を壊しますか?
非正規化、列の追加、より大きなストレージ用の列の変更、新しいテーブルでの設計の拡張などはすべて非破壊的な変更であり、第4正規形に到達したDBデザイナーはそれを確信します。
カラム/テーブルを削除するか、タイプの変更を壊すことにより、明らかに変更を壊すことが可能です。はい、可能ですが、実際的にはここで問題を経験したことはありません。おそらく、重大な変更とは何かが理解されており、これらは適切に管理されているからでしょうか?
共有読み取り専用スキーマのコンテキストでスキーマの変更を壊すケースを聞きたいです。
マイクロサービスについてより重要で重要なものは何ですか:APIまたはデータベーススキーマですか?API。これは、他の世界との契約であるためです。
この声明には同意しますが、エンタープライズアーキテクトから「データは永遠に続く」という重要な警告があると思います。つまり、APIは最も重要なものですが、データは企業全体にとってもかなり重要であり、非常に長い間重要です。
たとえば、ビジネスインテリジェンスのデータウェアハウスにデータを入力する必要がある場合、APIに関係なく、ビジネスレポートの観点からスキーマとCDCサポートが重要になります。
APIの問題?
APIが完璧で簡単だった場合、ローカルの読み取り専用アクセスではなく、常にAPIを選択するため、すべてのポイントは意味がありません。したがって、ローカルの読み取り専用アクセスを検討する動機付けは、ローカルアクセスが回避するAPIの使用に問題がある可能性があることです。
What motivates people to desire local read-only access?
APIの最適化:
LinkedInは、APIの最適化の問題と、その規模で重要である理由について(2009年から)興味深いプレゼンテーションを行っています。http://www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment
要するに、APIは多くの異なるユースケースをサポートする必要があると、ネットワークの観点とデータベースの観点から、1つのユースケースを最適にサポートし、残りをかなり不十分にサポートする状況に簡単に陥ることがあります。
APIにLinkedInと同じ洗練度がない場合、次のようなシナリオを簡単に取得できます。
- APIは必要以上に多くのデータを取得します(無駄です)
- 何度もAPIを呼び出す必要があるChatty API
はい。もちろん、APIにキャッシュを追加できますが、最終的にAPI呼び出しはリモート呼び出しであり、データがローカルの場合、開発者は一連の最適化を利用できます。
私はそれを追加するかもしれない人々のセットがあると思う:
- マスターデータのマイクロサービスデータベースへの低コストのレプリケーション(開発コストがかからず、技術的に効率的)
- 正規化への信頼とスキーマ変更に対するアプリケーションの回復力
- すべてのユースケースを簡単に最適化し、おしゃべり/無駄/非効率的なリモートAPI呼び出しを潜在的に回避する機能
- さらに、制約と一貫性のある設計に関する他のいくつかの利点
この答えは長すぎます。おApび!!