Modelos de datos


<< Sobre bases de datos relacionales / About relational databases

Charlando con otros pros de TI que han trabajado con bases de datos, coincidimos en los procesos de normalización, solo que recién estuve leyendo unos libros respecto a este tema desde una perspectiva un poco diferente a como venía yo haciendo.

Los libros tratan sobre cómo realizar modelos de datos y patrones de diseño involucrando una variable más (que de manera no tan formal he venido usando): el tiempo. Este aspecto a incluir cambia en buena medida el diseño original de una base de datos, por pequeña que sea, a la vez que otorga flexibilidad y capacidad de crecimiento del propio sistema.

Vamos a retomar el ejemplo de la publicación anterior donde teníamos ya una tabla de contactos relacionada con una tabla de ciudades y otra tabla de grupos. Este diseño permite evitar repetir información de estas dos tablas y reduce considerablemente los errores de captura, haciendo más sencillas las búsquedas. Pero ¿Y si necesitamos agregar más números telefónicos por contacto, más direcciones de correo e incluso las redes sociales donde están registrados? ¿Y si cada contacto pertenece a más de un grupo?

Incluiré una notación para hacer más simple y claro esto (Donde el(los) campo(s) en negrita y subrayado será la llave principal):

TABLA:=<campo1, campo2, ..., campo-n>

Para poder registrar más de un número telefónico de cada uno de nuestros contactos, lo que haremos será quitar el campo teléfono de la tabla de contactos, luego creamos una tabla llamada teléfonos con la siguiente estructura:

TELEFONO:=<Id, Id_contacto, Teléfono, Tipo_Telefono>
. Este último campo será para poder especificar si es teléfono de casa, de celular, trabajo, temporal, emergencias, etc. Y realizamos una asociación de Id_contacto con el Id de la tabla Contactos.

Para registrar más de una dirección de correo electrónico, repetimos el proceso pero con el campo "correo".

CORREO:=<Id, Id_contacto, Correo>
. Con esto tenemos ya capacidad para registrar cualquier cantidad de correos por contacto y cualquier cantidad de teléfonos también (por si no los encontramos en uno, intentamos con otro). Tanto así, que si deseamos saber con qué frecuencia cambian de teléfono o cuándo los hemos ido registrando, en las tablas de teléfono y de correo podemos agregar un campo de Desde que guarde la fecha en que lo registramos, y un campo opcional hasta que guarde le fecha hasta la cuál, el número o correo permaneció vigente.

Para el caso de los grupos, generamos una tabla de grupos, similar a como creamos la de ciudades, luego quitamos el campo Grupo de la tabla de contactos y NO creamos otro campo. Creamos una tabla que llamaremos Grupos_contactos

CONTACTO:=<Id, Id_Contacto, Id_grupo, Desde>
. Esto permitirá registrar los grupos con los que está asociado el contacto y a partir de qué fecha lo incluimos en dichos grupos.



Chatting with other IT pros that have worked with databases, we coincide in the normalization process, but recently, I was reading some books about this topic from a bit different perspective than I came doing it.

The books talk about how to made data models and design patterns involving one more variable (which I have using in an informal way): the time. This aspect to include changes in a considerable form the original design for a database, no matter which small it is, at the same time that grants flexibility and a capacity to grow to the system.

Let's take the example from the previous publication, where we had a contact table related with a city table and another of groups. This design allow avoid to repeat information of this two tables ans reduce considerably the input errors, doing easyer the serachings. But: If it's necessary add more than one phone number for each contact, mor e-mail addresses or even the social networks where they are registred? If each contact belongs to more than one group?

I'll include a notation in order to do smilpest and clear this (where the bold and underlined fields will be primary key):

TABLE:=< field1, field2, ..., field-n >

To register more than one phone number for each of our contacts, what we'll do will be remove the phone field from the contact table, then we create a table called phones with the next structure:

PHONE:= < Id, Id_contact, Phone, Phone_Type >

This last field will be to specify if the phone is of home, office, cell, temporary, emergency, etc. And we perform an association between Id_Contact and the Id in the contact table.

To register more tan one e-mail address, we repeat the process but qith de "mail" field.

MAIL:=%lt;Id, Id_contact, Mail>

With this we have the capacity for store any amount of e-mail address per contact, any amount of pone numbers also (if we cannt' find them inone number, we try with the other ;) ).

Comentarios

Entradas populares