1


0

1対多の構成とデータ取得

これは古典的な問題であり、私が満足していた解決策を思い付くことができなかったようです。 この問題に対するオブジェクト指向のエレガントでDBスケーラブルなアプローチとは何でしょうか?

Employee
- Name, Phone, Meta, etc

Company
- Meta, etc
- Employee[]

CompanyRepository (RDMBS)
- Company GetById(int)
- Company[] GetAll()

アプローチ#1: 'GetById' 'tCompany’からすべてを選択し、左結合 'tEmployee’を選択します。 Sql Selectは12行を生成します。 12人の従業員が居住する単一の会社を返します。

'GetAll’上記と同じ選択ですが、12,000,000行を返します。 創造的なループとロジックを通じて、それぞれ12人の従業員を抱える1,000,000社を返します。

アプローチ#2: 'GetById' …​ 同上

'すべて取得'。 「tCompany」からすべて選択しますが、「tEmployee」からは選択しません。 SQL選択は1,000,000行を生成します。 1,000,000の会社を返しますが、それぞれの会社にはnullの「従業員」プロパティがあります。

*アプローチ#3 * …​ ドメインを、「SimpleCompany」から継承するが「Employees」プロパティを持つメタと「ComplexCompany」のみを含む「SimpleCompany」に分割します。 GetByIdは「ComplexCompany」を返し、GetAllは「SimpleCompany」配列を返します。

  1. それぞれ異なる理由で臭いがします。

1 Answer


0


すべての会社(12,000,000行)を取得するビジネス上の理由は何ですか? 一度に12,000,000行すべてをメモリに保持することはお勧めしません。

ページネーションを使用する必要があるかもしれません。 一度に限られた会社のセットを選択し、行が返されなくなるまでページ間を繰り返します。

public Company[] GetAllByPageNumber(int pageNumber, int pageSize)

ここでのマイナス面は、反復中にCompanyを挿入または削除しないことです。