Композиция «один ко многим» и поиск данных - PullRequest
1 голос
/ 10 февраля 2010

Это классическая проблема, с которой я никогда не смог бы найти решение, которое меня порадовало. Что будет считаться ОО-элегантным и масштабируемым БД подходом к этой проблеме?

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 строк. Через творческие циклы и логику возвращается 1 000 000 компаний, каждая из которых имеет 12 сотрудников.

Подход № 2: 'GetById' ... такой же, как указано выше

GETALL. Выбирает все из «tCompany», но ничего из «tEmployee». Sql select дает 1000000 строк. Возвращает 1 000 000 компаний, но каждая из которых имеет нулевое свойство «Сотрудники».

Подход № 3 ... разделить домен на SimpleCompany, содержащую только meta и ComplexCompany, которая наследуется от SimpleCompany, но имеет свойство Employees. GetById возвращает значение ComplexCompany, а GetAll возвращает массив SimpleCompany.

... каждый пахнет плохо по разным причинам.

1 Ответ

0 голосов
/ 11 февраля 2010

Какова бизнес-причина, чтобы получить все компании (12 000 000 строк)? Я бы не советовал вам хранить в памяти все 12 000 000 строк одновременно.

Может быть, вы должны использовать нумерацию страниц. Выбирайте ограниченный набор компаний за раз, затем переходите от одной страницы к другой, пока строки не будут возвращены.

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

Недостатком является то, что компания не должна быть вставлена ​​или удалена во время итерации.

...