Simple Machines Community Forum

SMF Support => Language Specific Support => Español (Spanish) => Aiheen aloitti: manixless - marraskuu 07, 2012, 09:35:23 IP

Otsikko: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: manixless - marraskuu 07, 2012, 09:35:23 IP
Hola,

Estaba revisando el código de la función prepareDisplayContext que se encuentra en el archivo Sources/Display.php, esto porque tuve la curiosidad de saber cómo la información del mensaje es llenado/creado y de pronto noté estas líneas:


// Attempt to get the next message.
$message = $smcFunc['db_fetch_assoc']($messages_request);


De acuerdo al código anterior, parece ser que $messages_request  actúa como un identificador para cargar el mensaje en cuestión desde la base de datos. Pero la cosa se empieza a poner extraña cuando el array del mensaje se empieza a llenar como se ve a continuación:


// Compose the memory eat- I mean message array.
$output = array(
'attachment' => loadAttachmentContext($message['id_msg']),
'alternate' => $counter % 2,
'id' => $message['id_msg'],
'href' => $scripturl . '?topic=' . $topic . '.msg' . $message['id_msg'] . '#msg' . $message['id_msg'],
'link' => '<a href="' . $scripturl . '?topic=' . $topic . '.msg' . $message['id_msg'] . '#msg' . $message['id_msg'] . '" rel="nofollow">' . $message['subject'] . '</a>',
'member' => &$memberContext[$message['id_member']],
'icon' => $message['icon'],


Estoy un poco desconcertado. ¿Por qué? porque llama la atención la línea 'member' => &$memberContext[$message['id_member']], donde la información del usuario parece ser cargada por otra función que posiblemente hace una consulta extra (query) a la base de datos.

Entonces, acaso esta metodología me está sugiriendo que:

1 . no es recomendable hacer una única consulta por mensaje haciendo uso de las cláusulas JOIN entre tablas como smf_messages-> smf_members?
2. si yo quiero hace un JOIN de mi tabla personalizada con la tabla smf_messages, debería hacer mi propia función que haga un select de los hijos? Por ejemplo  'editors' => cargar_editores_de_este_mensaje($message['id_msg'])
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: ^HeRaCLeS^ - marraskuu 08, 2012, 05:16:22 AP
Vos miraste las funcion loadAttachmentContext y lo que llama la variable $memberContext?

Lainaa1 . no es recomendable hacer una única consulta por mensaje haciendo uso de las cláusulas JOIN entre tablas como smf_messages-> smf_members?

No creo que te sea tan simple unir todo eso!

En el Load.php busca function loadMemberContext($user, $display_custom_fields = false)
Ahi veras todo lo que carga la variable memberContext.

Y en el Display.php busca function loadAttachmentContext($id_msg)
Esa seria la que carga los adjuntos.

Fijate por vos mismo si seria conveniente realizarlo como vos decis.
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: All Colours Sam - marraskuu 08, 2012, 09:42:59 AP
Como ya mencioné en tu tema en Inglés, la información del usuario se carga de forma separada por razones de rendimiento, hay una funcion especial que se encarga de cargar toda la info de un usuario, también se encarga de usar el cache cuando sea posible y también revisa si la info ya esta cargada para no volverla a cargar.

Si tu quieres cargar la info del usuario en la misma query que los mensajes, vas a matar a tu servidor, asi de simple.

Unir tablas con JOIN es recomendable pero la query en Display es totalmente distinta y es un caso especial que debe de tratarse como tal.
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: manixless - marraskuu 08, 2012, 10:06:53 AP
Hola Suki,

No te quiero discutir la forma en que los datos del usuario son cargados, bien es sabiedo quee está manejado por un sistema de caché para evitar gasta inncesario de recursos, perfecto.

Tal vez mi pregunta va más oriendada a analizar un poco en cómo es el impacto sobre estas dos situaciones:

1. Una única sentencia para minimizar los accesos a la base de datos
2. O crear funciones que carguen información de la base de datos separadamente y gestionarlas en la aplicación.

Recuerda que bajo el uso de caché/proxies es una buena práctica, pero que dificilmente las personas que hagan sus cambios en el código lo consideren.

Finalmente, esta pregunta nació porque quería conocer la forma adecuada de incluir datos en el $output del mensaje. (traidos de otra tabla)   
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: All Colours Sam - marraskuu 08, 2012, 10:15:35 AP
Una única sentencia en esta parte en particular no es posible, como ya dije antes, los mensajes se separan en partes pequeñas para evitar la sobrecarga del servidor, si se hiciera como tu lo quieres hacer, la mayoria de foros en servidores gratuitos simplemente no podrian existir debido a la gran cantidad de recursos que esta parte en particular necesitaria.


De nuevo, que es exactamente lo que quieres hacer?  habla en concreto por favor.  La forma adecuada de agregar datos a el output depende enteramente de que clase de datos quieres agregar, sin saber que es exactamente lo que quieres hacer es muy dificil ayudarte.

En cuanto a el cache, no es necesario que las personas que hagan cambios en sus foros lo tomen en cuenta, se debe de tomar en cuenta en ocasiones especificas, por ejemplo, si tu información se va a utilizar en repetidas ocasiones o si tu query es bastante compleja y toma un tiempo considerable el realizarla.
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: manixless - marraskuu 08, 2012, 10:44:47 AP
No tengo una pregunta específica, sino tener un mejor panorama de la situación. Sin embargo, voy a aprovechar para que veas esta estructura:

Tabla smf_frutas
id_fruta |  id_msg  | descripcion

Para poder cargar las frutas de un mensaje inicialemente se tiene:


$output = array(
'fruits' => load_fruits($message['id_msg']),


donde load_fruits es:


function load_fruits($id_msg)
{
    $fruits = query("select f from smf_fruits f where id_msg = $id_msg");
    return $fruits;
}


¿qué opinas?
Otsikko: Re: La forma en que se obtiene la información de los mensajes para ser desplegados
Kirjoitti: All Colours Sam - marraskuu 08, 2012, 11:02:45 AP
Para tener un mejor panorama debes de entender cómo Display()  funciona, cómo primero carga los temas separando los que no son accesibles a el usuario que está viendo la página, luego carga los mensajes para esos temas, dejando a un lado los mensajes sin aprobar o los que no puede ver este usuario, solo después va a empezar a cargar la info de los mensajes restantes.

En cuanto a tu estructura, si solo tienes esas tres columnas puedes hacer un LEFT JOIN en la ultima query de Display() la que carga la info de los mensajes, siempre pensando en bases de datos con bastantes mensajes.