Hola Mariano, Te olvidaste de este post? Realmente me interesa (y a Pablo tambien, según parece) saber cual seria el esquema optimo para resolver el ejemplo que planteaste.
Pido perdon de antemano por molestar :) Carlos Peix > -----Original Message----- > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of > Carlos Peix > Sent: Martes, 30 de Octubre de 2007 08:25 a.m. > To: [EMAIL PROTECTED] > Subject: [dbms] [dbms] Diseño de Base de Datos > > Hola Mariano, > > Oooops, que consulta! > > Tene razon, el caso que mencionas no se me habia ocurrido. Ya > que estamos, cual seria el diseño de las dos tablas mas > recomentable para este caso? (Suponiendo que cada cliente > tiene una lista de direcciones con los periodos temporales de > validez de cada una.) > > Carlos Peix > > > -----Original Message----- > > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Jose > > Mariano Alvarez > > Sent: Lunes, 29 de Octubre de 2007 08:02 p.m. > > To: [EMAIL PROTECTED] > > Subject: [dbms] Re: RE: [dbms] Re: [dbms] Diseño de Base de Datos > > > > Pregunta. > > > > Segun tu modelo como relacionas todas las direcciones de un > club con > > las fechas. > > O sea si tenes que sacar un reporte con apertura mes por > mes junto con > > la direccion correspondiente a esa fecha de los ultimos 5 > años de como > > evoluciono el padron de socios ? > > > > Pregunto esto, porque se me ocurre que el modelo que > propones no tiene > > una solucion simple de indices ya que es bastante sensible > respecto de > > como armar los clustered index de las tablas involucradas y por lo > > tanto dado que los noncluster index son menos utiles habria que > > crearlos como Cover index para que funcionen eficientemente. Esto > > quiza no se vea tanto bajo consultas puntuales sino bajo procesos > > batch. La idea es que responda con minimo IO de disco para evitar > > carga sino tambien bloqueos y deadlocks. > > > > > > Saludos > > > > -- > > -------------------------------- > > Atte. > > Ing. Jose Mariano Alvarez > > SQL Total Consulting > > > > > > > > > > > > > > On 10/29/07, Carlos Peix <[EMAIL PROTECTED]> wrote: > > > De acuerdo al termino que usas ahora y al que usaste en el > > post anterior, me > > > parece que no logro aclarar bien la situacion. > > > > > > Vos decis "columna de marca" y me da la impresión de que > > entendes que coloco una > > > columna en la tabla Direcciones indicando el registro > > actual (a menos que > > > columna de marca tenga un significado especial). > > > > > > Lo que yo suelo hacer es agregar una columna en la tabla de > > Clientes que es una > > > FK a la tabla de Direcciones. Por ahí esto se aclara si me > > das una pista sobre > > > la solucion que vos preferis. > > > > > > Entendi lo del null, tendria que evaluar con mas detalle el > > impacto de esto en > > > situaciones reales, pero me atreveria a decir que nunca uso > > un indice por fecha > > > para acceder a las colecciones de este tipo. Otra opcion > > mucho mas comoda es > > > poner DateTime.MaxValue :). > > > > > > Abrazo > > > > > > Carlos Peix > > > > > > > -----Original Message----- > > > > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of > > > > Jose Mariano Alvarez > > > > Sent: Lunes, 29 de Octubre de 2007 01:47 p.m. > > > > To: [EMAIL PROTECTED] > > > > Subject: [dbms] Re: [dbms] Diseño de Base de Datos > > > > > > > > Si lo entendi, por eso te dije que no usaria el indice aunque > > > > exista por esa columna de marca. Hay un conocido CRM del > > > > mercado que tiene problemas de ese estilo. > > > > > > > > Ademas, nunca uses NULL y si usa una fecha maxima porque > > > > invalida el uso de indices en SQL Server. > > > > > > > > Saludos > > > > -- > > > > -------------------------------- > > > > Atte. > > > > Ing. Jose Mariano Alvarez > > > > SQL Total Consulting > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 10/29/07, Carlos Peix <[EMAIL PROTECTED]> wrote: > > > > > Hola Mariano, > > > > > > > > > > Gracias por seguir la discusion. > > > > > > > > > > Creo que no me explique correctamente. En el caso que > > > > planteo Pablo, tendrias > > > > > una colección de direcciones con su correspndiente periodo > > > > de validez (fecha > > > > > desde hasta) y la ultima direccion tendria un rango abierto > > > > en su extremo > > > > > superior, esto es, la FechaHasta de validez de la direccion > > > > con valor null o con > > > > > valor MaxDate (prefiero lo primero). > > > > > > > > > > La desnormalizacion que yo hago (cuando la evidencia > > > > demuestra que es encesaria) > > > > > es dejar una referencia a la direccion activa en el objeto > > > > principal (ademas de > > > > > la coleccion). Esto, en terminos de la base de datos, > > > > significa que la tabla > > > > > Clientes tendira una columna que se llamaria > > > > IdDireccionActual, una FK a la > > > > > tabla de direcciones. Probablemente esta columna > > tendria un indice. > > > > > > > > > > La ventaja de esta optimizacion es que puede hacerse si > > > > alterar la interfaz del > > > > > objeto Cliente. > > > > > > > > > > Habias entendido esto? > > > > > > > > > > Por otro lado y creo que fuera del ambito de este thread > > > > esta el caso donde se > > > > > procesa logica en el query, por ejemplo, validar los mil > > > > registros que vos > > > > > mencionas contra los datos del cliente. Esto es otra cosa > > > > distinta. Yo no hago > > > > > esto en un SP, aunque reconozco que la velocidad de proceso > > > > puede ser muy > > > > > superior. Hay un thread que mantuvimos con Maxi en el 2004 > > > > por este tema, con > > > > > ejemplos de codigo (de el y mios), como siempre en casos de > > > > arquitectura, con > > > > > soluciones validas pero con final abierto, dependiendo de > > > > lo que priorice cada > > > > > uno :). > > > > > > > > > > Carlos Peix > > > > > > > > > > > -----Original Message----- > > > > > > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of > > > > > > Jose Mariano Alvarez > > > > > > Sent: Lunes, 29 de Octubre de 2007 01:08 p.m. > > > > > > To: [EMAIL PROTECTED] > > > > > > Subject: [dbms] Re: [dbms] Diseño de Base de Datos > > > > > > > > > > > > Carlos: > > > > > > > > > > > > Si es así. Coincidimos con eso. > > > > > > En ese caso es eficiente solo si accedes a un registro. > > > > > > > > > > > > Veamos un ejemplo simple. > > > > > > > > > > > > Supongamos que quieres procesar un conjunto pequeño de datos > > > > > > de digamos 1000 registros de ventas provenientes de una > > > > > > interfaz (algo muy clásico y normal en las empresas) y > > > > > > quieres relacionarlo con los datos de los clientes que > > > > > > justamente es un ejemplo de esta tabla que mantiene la > > > > > > historia donde aplicas ese patrón mediante las > fechas desde y > > > > > > hasta y la marca de actual (en tu caso hablaríamos de > > > > > > objetos). Aunque tengas los índices, tienes dos opciones, o > > > > > > debes bajarte todos los datos de clientes a una colección en > > > > > > memoria para accederlo de manera eficiente o haces los 1000 > > > > > > accesos a la tabla que aunque sea por índice es al menos > > > > > > varios órdenes de magnitud más lento. Justamente esto es en > > > > > > términos de bases de datos relacionales un JOIN de dos > > > > > > entidades para lo cual la base de datos es muchísimo mas > > > > eficiente. > > > > > > > > > > > > Obviamente esto no tiene sentido considerarlo para una > > > > > > operación individual de acceso a un único registro. > > > > > > > > > > > > Otra cosa importante es que si bien lo que propone Carlos no > > > > > > es lo mejor tampoco es lo peor. > > > > > > > > > > > > Entiendo que es más fácil y eficiente programar y diseñar de > > > > > > la manera que propones pero no es la manera adecuada a mi > > > > > > criterio. La base de datos es uno de los componentes > > > > > > principales de los sistemas y deben ser usados de la manera > > > > > > adecuada. Existen herramientas adecuadas para modelarlas y > > > > > > diseñarlas desde hace muchos años. Cada vez hay más > problemas > > > > > > graves con las bases de datos ya que nunca se las considera > > > > > > en los diseños, ni siquiera de la manera en que Carlos la > > > > > > toma en cuanta. > > > > > > > > > > > > Saludos > > > > > > > > > > > > -- > > > > > > -------------------------------- > > > > > > Atte. > > > > > > Ing. Jose Mariano Alvarez > > > > > > SQL Total Consulting > > > > > > > > > > > > > > > > > > > > > > > > On 10/29/07, Carlos Peix <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > > > > Hola Mariano, > > > > > > > > > > > > > > Perdonen si sigo bajo el mismo thread pero me > parece que es > > > > > > util para alguien (por lo menos para mi lo es :-) ). > > > > > > > > > > > > > > Entiendo que te referis al patrin Effectivity. Un patron > > > > > > parecido y mas adecuado al caso es Temporal Property, en la > > > > > > definicion de Fowler. De todas maneras, creo que te > referis a > > > > > > la manera de obtener la propiedad actual, cosa que en la > > > > > > implementacion mas sencilla consiste en obtener la propiedad > > > > > > efectiva al dia de hoy (obligando a acceder a la coleccion). > > > > > > > > > > > > > > Casi siempre que he utilizado este patron he tenido que > > > > > > desnormalizar el modelo dejando una referencia persistente a > > > > > > la instancia activa. Esto no ha sido tanto por la > performance > > > > > > del acceso a la propiedad como por el motivo de hacer un > > > > > > query eficiente. Justo lo que vos mencionas, segun entiendo. > > > > > > > > > > > > > > Entonces, llego a la misma desnormalizacion pero por via > > > > > > diferente. Lo importante es que en todos los casos, esta > > > > > > desnormalizacion siempre me ha quedado oculta dentro del > > > > > > objeto en cuestion. > > > > > > > > > > > > > > Espero haber interpretado tu comentario. > > > > > > > > > > > > > > Carlos Peix > > > > > > > > > > > > > > > > > > > > > > > > > > > > ________________________________ > > > > > > From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of > > > > > > Jose Mariano Alvarez > > > > > > > Sent: Lunes, 29 de Octubre de 2007 09:21 a.m. > > > > > > > To: [EMAIL PROTECTED] > > > > > > > Subject: [dbms] Re: [dbms] Diseño de Base de Datos > > > > > > > > > > > > > > > > > > > > > > > > > > > > Ven carlos, eso es justamente lo que decia. > > > > > > > > > > > > > > Si sigues ese patron al pie de la letra segun Fowler > > > > > > utilizas de manera ineficiente la base de datos y es muy > > > > > > probable que no puedas usar de manera adecuada los indices. > > > > > > > > > > > > > > > > > > > > > Saludos > > > > > > > > > > > > > > -- > > > > > > > -------------------------------- > > > > > > > Atte. > > > > > > > Ing. Jose Mariano Alvarez > > > > > > > SQL Total Consulting > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 10/29/07, Carlos Peix > <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > > > > > > > Hola Pablo, > > > > > > > > > > > > > > > > En mi opinion es clave identificar el motivo por el cual > > > > > > estas generando esas copias de la informacion. > > > > > > > > > > > > > > > > Si las estas generando por razones de auditoria, es muy > > > > > > probable que las copias no signifiquen nada para la > logica de > > > > > > tu aplicacion. Normalmente esas copias o versiones de cada > > > > > > fila se consultan con aplicaciones especiales de auditoria > > > > > > (que vos mismo construyas). En este caso, lo mas comodo es > > > > > > hacerlo con triggers o con stored procedures, yo > prefiero los > > > > > > triggers y asi lo hago cada vez que tengo esta necesidad. > > > > > > > > > > > > > > > > En cambio, si la copia de la informacion tienen un > > > > > > sentido en tu modelo (patron Effectivity por ejemplo), creo > > > > > > que es recomendable implementarlo del lado del codigo. > > > > > > > > > > > > > > > > Tambien es cierto que en las aplicaciones que son solo > > > > > > ABMs es dificil ver la ventaja de implementar la logica en > > > > > > uno u otro lado, ya que, en general, la logica es casi > > > > iniexistente. > > > > > > > > > > > > > > > > Por supuesto, estas son mis preferencias. > > > > > > > > > > > > > > > > Carlos Peix > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ________________________________ > > > > > > From: [email protected] [mailto: [EMAIL PROTECTED] On > > Behalf Of Pablo > > > > > > Maximo Mazzitelli > > > > > > > > Sent: Sábado, 27 de Octubre de 2007 01:35 p.m. > > > > > > > > To: [EMAIL PROTECTED] > > > > > > > > Subject: [dbms] RE: [dbms] RE: [dbms] Diseño de > > Base de Datos > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Mmmmm, a ver si entendi… yo tengo una aplicación > > > > > > sencillita. Un panel con botones que habilitan a distintos > > > > > > formularios de allta y modificacion. Otro tipo de > opcion para > > > > > > hacer busquedas. O sea algo basico y estandar. Un tipico > > > > > > Alta, Baja, Modificacion y Consulta de datos pero con > > > > > > historial de datos. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > No entiendo bien del hecho de olvidarme de la base de > > > > > > datos ya que casi toda la aplicación esta basada en ella. O > > > > > > sea estoy casi siempre persistiendo. Mi duda vendria en el > > > > > > caso de la opcion de modicacion de datos donde tambien estoy > > > > > > persistiendo. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Podrian abrirme mas la cabeza al respecto? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Gracias > > > > > > > > > > > > > > > > Pablo > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > __________ Información de NOD32, revisión 2623 (20071029) > > > > __________ > > > > > > > > > > > > Este mensaje ha sido analizado con NOD32 antivirus system > > > > > > http://www.nod32.com > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > __________ Información de NOD32, revisión 2623 (20071029) > > __________ > > > > > > > > Este mensaje ha sido analizado con NOD32 antivirus system > > > > http://www.nod32.com > > > > > > > > > > > > > > > > > > > > > __________ Información de NOD32, revisión 2626 (20071030) __________ > > > > Este mensaje ha sido analizado con NOD32 antivirus system > > http://www.nod32.com > > > > > > > __________ Información de NOD32, revisión 2626 (20071030) __________ > > Este mensaje ha sido analizado con NOD32 antivirus system > http://www.nod32.com > >
