Объектно-ориентированное представление многотабличного запроса - PullRequest
0 голосов
/ 24 августа 2010

Предположим, у нас есть две связанные таблицы, например, одна, представляющая человека:

PERSON

  • имя
  • возраст
  • ...
  • current_status_id

и один представляет обновление статуса в определенное время для этого человека:

STATUS_HISTORY

  • recorded_on
  • status_id
  • blood_pressure
  • длина
  • ...

Я построил приложение на PHP с использованием Zend Framework и попытался сохранить «объектно-ориентированность», используя класс для представления личности и класс для представления статуса человека. Я также пытался использовать принципы ORM, где это возможно, например, использование картографа данных для отделения модели предметной области от слоя данных.

Каким был бы хороший (и объектно-ориентированный) способ вернуть список людей из картографа данных, когда в списке я иногда хочу знать последнее измеренное кровяное давление человека, а иногда нет (в зависимости от требований отчета / представления, в котором используется список). То же самое верно для разных полей, например значения, рассчитанные на уровне данных (сумма, количество и т. д.).

Моей первой мыслью было использование набора строк (например, Zend_Db_Rowset), но это создает высокую связь между моим представлением и уровнем данных. Другой способ может состоять в том, чтобы вернуть список людей, а затем запросить для каждого человека последний статус с помощью картографа данных для запроса статуса конкретного человека. Однако это приведет к (как минимум) одному дополнительному запросу для каждой записи о человеке и не позволит мне использовать JOINS на уровне данных.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

У нас такая же проблема из-за нашего ORM, где я работаю.Если вы достаточно обеспокоены производительностью, связанной с необходимостью сначала получить список своих людей, а затем запросить их статусы индивидуально, у вас действительно не останется другого выбора, кроме как связать немного своих данных.

В моеммнение, это нормально.Вы можете либо создать класс, который будет содержать отдельные данные «person» и массив, содержащий записи «status_history», либо понизить производительность при выполнении другого запроса на «person».Вы МОЖЕТЕ уменьшить свои накладные расходы, выполняя локальное кэширование данных (ваш контроллер должен будет решить, что если запрос набора данных будет выполнен до определенного временного порога, он просто вернет свои собственные данные вместо того, чтобы запрашивать сервер БД)

Иметь чистый ОО вид хорошо, но иногда нецелесообразно.

0 голосов
/ 25 августа 2010

Попробуйте использовать класс "stdclass", который является встроенным классом PHP. Вы можете получить объект stdclass, который будет автоматически создан PHP, а его переменной-члену будет имя столбца.Таким образом, вы можете получить объект и получить значения по имени столбца.Например.

Запрос:

SELECT a.dept_id, a.dept_name, a.e_id, b.emp_name, b.emp_id из DEPT a, EMP b, где b.emp_id = a.e_id;

Результатом будет массив объектов stdclass.Каждая строка представляет один объект stdclass.

Object

STDCLASS {dept_id;dept_name;e_id;emp_id;emp_name;}

Вы можете получить доступ как
foreach ($ resultset as $ row) {$ d_id = $ row-> dept_id;$ d_nam = $ row-> dept_name;$ e_id = $ row-> e_id;$ em_id = $ row-> emp_id;$ e_nam = $ row-> emp_name;}

Но

Blockquote

Я не уверен в производительности.

...