$user->get_email_address()?public function get_email_address() {
if (!$this->email_address) {
$this->read_from_database('email_address');
}
return $this->email_address;
}
public function __construct(..., $id = 0) {
if ($id) {
$this->load_all_data_from_db($id);
}
}
public function get_email_address() {
return $this->email_address;
}
Мой основной вопрос: лучше ли минимизировать количество запросов к базе данных или лучше всего минимизировать объем данных, передаваемых из базы данных.
Другая возможность состоит в том, что лучше всего загружать атрибуты, которые вам нужны больше всего / содержать минимум данных при создании объекта, а все остальное - по запросу.
Последующий вопрос: что делают фреймворки абстракции ORM, такие как Activerecord?






Минимизируйте количество запросов. Оптимальное количество запросов - 0, но если вы должны запросить, потому что оно не кэшировано, это 1. Запросы для каждого свойства - верный путь к системе, которая никогда не будет масштабироваться, имеет серьезные проблемы с конкуренцией и вызовет гораздо больше головной боли, чем его ценность.
Я должен упомянуть, что есть смысл в отложенной загрузке (о которой вы говорите на шаге 1) если маловероятно, что вам понадобятся данные, которые загружаются лениво. Однако, если вы можете, лучше быть явным и получить в точности или почти в точности то, что вам нужно. Чем меньше времени вы тратите на запросы, тем меньше времени открыто ваше соединение и тем более масштабируема ваша система.
Я бы согласился с aaronjensen, за исключением случаев, когда объем извлекаемых данных настолько велик, что вы начнете использовать чрезмерный объем памяти. Я думаю, где в строке есть 3 текстовых поля, которые все довольно большие, и все, что вам нужно, - это поле идентификатора.
На самом деле нет правильного ответа. Зависит от того, сколько пользователей вы загружаете одновременно, сколько текстовых / больших двоичных полей находится в вашей таблице User, загружает ли ваша таблица пользователей какие-либо связанные дочерние объекты. Как говорит Аарондженсен, этот шаблон называется ленивая загрузка, а противоположное поведение (загрузка все заранее на всякий случай) известно как жадная загрузка.
Тем не менее, есть третий вариант, который вы, возможно, захотите рассмотреть, а именно ленивую загрузку всего объекта User при доступе к любому из его свойств:
public function get_email_address() {
if (!$this->email_address) {
$this->load_all_data_from_db($this->id)
}
return $this->email_address;
}
Преимущества этого подхода заключаются в том, что вы можете создать коллекцию пользователей (например, список всех пользователей, чьи пароли пусты, возможно?) На основе только их идентификаторов, без потери памяти при полной загрузке каждого пользователя, но тогда вам потребуется только один вызов базы данных для каждого пользователя для заполнения остальных пользовательских полей.
Я полностью согласен, но должен добавить ... Обычно это должно выполняться в DAO (объект доступа к данным), а не в модели.