質問: **30の異なるDBスキーマを持つ165のデータベースからユーザーリスト**を**取得**するAPIを構築してい**ます** 。 テーブル`User`ようないくつかのテーブルは異なる名前を持つかもしれません、それは`User` 、 `Users` 、 `AspNetUsers` 、 `ApplicationUser`と名付けられるかもしれません。 特定のテーブルのフィールドには、同じ情報が含まれていても名前が異なる場合があります。列`UserId`ように、異なるスキーマでは`userId` 、 `user_id` 、 `uid` 、 `id`と名付けることができます。 すべてのデータベースからすべてのユーザー(C#のプロパティ: `UserId` 、 `UserName` )のリストを取得したいのですが、どうすればこれに到達できますか? 現在、私のアプリは、標準の推奨構成で1つのデータベースにのみ接続されています。
回答: 「30の異なるDBスキーマを持つ165個のデータベース」をクエリするには、最初に直面するのは**パフォーマンス**です。革新的なソリューションが必要です。 `distributed`アプリケーションの**非常に重いクエリ**を処理する経験がありました。 APIにリクエストを送信すると(単に`GetUsersCount()`と呼びましょう)、APIは`parallel tasks`持つ他のAPIに多数のサブリクエスト(この場合は「165」リクエスト)を`GetUsersCount()` 、次にAPI `GetUsersCount()`すべての結果を応答に`concat`します。そのため、API `GetUsersCount()`はクエリを実行せず、結果**のみを** `concat`ます。これにより、応答時間を5〜10分から1秒に短縮しました。そのため、APIの後ろに`layer` (別のRESTful APIである必要があります)を追加する必要があります。このレイヤーは、EFコアを使用して特定の1つのデータベース**のみを**クエリします。 しかし、あなたの場合、あなたの結果はどのくらい大きいのでしょうか?結果を`sort/group/paging`ますか?しかし、上記のアイデアを持つより詳細な設計によって解決することもできます。 しかし、あなたは(2-3のDBなど)のみ、いくつかのDBを持っている場合、私は示唆しているクロスデータベースクエリをする`union`とのつのビューにすべてのいくつかのテーブルをリンクサーバー 、その後、使用キーレス・エンティティ・タイプを(クエリ-type)結果を視覚的に操作します。 2つのオプション: 1. EF Coreコードファーストアプローチで現在接続されているデータベースの`view`を作成し、テーブルとしてビューにアクセスします。参照されている投稿に従ってください、あなたはそれに到達します。 2. `trigger` (許可されている場合)を使用して、ビュースキーマを接続されたデータベースの1つの一意のテーブルに同期します。これは、データが膨大ではなく`group, sort, paging`結果を`group, sort, paging`する必要がある場合に最適です。