这是一个经典的问题,我似乎无法想出一个我满意的解决方案。对于这个问题,什么是OO优雅和数据库可扩展的方法?
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产生1,000,000行。返回1,000,000家公司,但每家公司都有一个空的'Employees'属性。
方法#3 ...将域拆分为仅包含元的'SimpleCompany'和'ComplexCompany',它继承自'SimpleCompany'但具有'Employees'属性。 GetById返回'ComplexCompany',GetAll返回'SimpleCompany'数组。
......各种气味因各种原因而闻起来。
答案 0 :(得分:0)
获得所有公司(12,000,000行)的商业理由是什么?我不建议你一次在内存中保留所有12,000,000行。
可能你应该使用分页。一次选择有限的公司集,然后从一个页面迭代到另一个页面,直到没有返回任何行。
public Company[] GetAllByPageNumber(int pageNumber, int pageSize)
这里的缺点是在迭代时不应插入或删除公司。