Объектно-реляционное сопоставление: как лучше всего реализовать геттеры?

Что должно произойти, когда я позвоню $user->get_email_address()?

Вариант 1. Получите адрес электронной почты из базы данных по запросу.

public function get_email_address() {
    if (!$this->email_address) {
        $this->read_from_database('email_address');
    }
    return $this->email_address;
}

Вариант 2. Извлечь адрес электронной почты (и другие атрибуты пользователя) из базы данных при создании объекта.

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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
838
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Минимизируйте количество запросов. Оптимальное количество запросов - 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 (объект доступа к данным), а не в модели.

Nick Stinemates 04.10.2008 19:49

Другие вопросы по теме