Использование DAO в другом DAO - хорошая или плохая практика? - PullRequest
3 голосов
/ 22 января 2010

Это может быть что-то очень тривиальное, но я новичок с некоторыми объектно-ориентированными паттернами.

Проще говоря, является ли плохой практикой использование методов из одного DAO в другом DAO? Я пытаюсь создать объект в DAO, и мне очень трудно создать этот объект , используя только этот DAO . Итак, можно ли использовать другие методы DAO в другом DAO?

Пример:

public function readAllUsers() {
    $sql = "SELECT * FROM user";
    return $this->execute($sql);
}

public function execute($sql) {
$result = mysql_query($sql, $this->getDBConnection())
                or die(mysql_error());
    $user = array();
    if(mysql_num_rows($result) > 0) {
        for($i = 0; $i < mysql_num_rows($result); $i++) {
            $row = mysql_fetch_assoc($result);
            $user[$i]->setUsername(row["userName"]);
             ...set user info...
            $user[$i]->setAddresses($addressDAO->readAddressByUserId($userId));
        }
    }
    return $user;
}

ПРИМЕЧАНИЕ: Существует множество атрибутов, подобных этому, в пользовательском объекте, которые имеют отношение «один ко многим» с самим объектом (адреса, электронные письма, номера телефонов и т. Д.). Запрос, который был бы необходим (со всеми используемыми таблицами связывания), был бы чрезвычайно сложным.

Спасибо

Steve

1 Ответ

2 голосов
/ 22 января 2010

Нет, я бы так не поступил.

Звучит так, будто вы хотите смоделировать отношения один-ко-многим, поэтому вы надеетесь использовать внутренний DAO для получения множества объектов, а затем отобразить их в один.

Сопротивляйся этому искушению.

Ваш код говорит вам, почему:

  1. Внешний цикл возвращает N объектов с отношением один ко многим.
  2. Внутренний цикл запрашивает один раз для каждого из N объектов и возвращает его зависимости.

Классическая ошибка запроса Noob N + 1. Задержка в сети убьет вас за большие N.

Правильнее всего сделать один запрос, который вернет все ваши данные за один раз и отобразит их в объект (ы).

Возможно, подойдет инструмент ORM, такой как Hibernate. Если у вас много отношений 1: m, я бы поспорил, что Hibernate будет лучше или эффективнее генерировать эффективный SQL, чем вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...