Pergunta

O que deve acontecer quando eu chamo $user->get_email_address()?

Opção 1: Puxe o endereço de e-mail do banco de dados sob demanda

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

Opção 2: Puxe o endereço de e-mail (e os outros atributos do usuário) a partir do banco de dados sobre a criação do objeto

public function __construct(..., $id = 0) {
    if ($id) {
        $this->load_all_data_from_db($id);
    }
}

public function get_email_address() {
    return $this->email_address;
}

A minha questão básica é se é melhor para minimizar o número de consultas de banco de dados, ou se é melhor para minimizar a quantidade de dados que são transferidos a partir do banco de dados.

Outra possibilidade é que é melhor para carregar os atributos que você vai precisar de mais / conter o mínimo de dados a criação do objeto e tudo o mais na demanda.

A follow-up questão: O que fazer estruturas de captação de ORM como ActiveRecord fazer

Foi útil?

Solução

Não há realmente uma resposta correta para isso. Depende de quantos usuários você está carregando ao mesmo tempo, quantas texto / campos blob estão em sua tabela de usuário, se a sua mesa cargas de usuário quaisquer objetos filho associados. Como aaronjensen diz, esse padrão é chamado carregamento lento - e o comportamento oposto (carga tudo na frente apenas no caso de você precisar dele) é conhecido como Carga antecipada .

Dito isto, há uma terceira opção que você pode querer considerar, que é carregamento lento todo o objeto do usuário quando qualquer de suas propriedades são acessados:

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

As vantagens desta abordagem é que você pode criar uma coleção de usuários (por exemplo, uma lista de todos os usuários cujas senhas estão em branco, talvez?) Com base apenas suas IDs, sem o hit memória de carregar totalmente a cada usuário único, mas, em seguida, você apenas necessita de uma chamada de banco de dados único para cada usuário para preencher o resto dos campos do usuário.

Outras dicas

Minimizar o número de consultas. O ideal # de consultas é 0, mas se você deve consultar porque não é armazenado em cache, é 1. Consultando para cada propriedade é uma certeza fogo maneira de um sistema que nunca vai escalar, tem problemas de contenção de massa, e causará maneira mais dores de cabeça do que o seu valor.

Eu devo mencionar que há um valor para o carregamento lento (que é o que você está falando no passo 1) se é improvável que você vai precisar dos dados que estão sendo preguiçosamente carregado. Se você puder, porém, é melhor ser explícito, e buscar exatamente ou quase exatamente o que você precisa. Quanto menos tempo você gasta a consulta, o tempo de menos sua conexão é aberta ea mais escalável seu sistema é.

Eu concordo com aaronjensen, exceto quando a quantidade de dados que você está puxando é tão grande que você vai começar a usar-se uma quantidade excessiva de memória. Estou pensando em uma fileira tem 3 campos de texto que são todos muito grande e tudo que você quer é o campo ID.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top