<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ENDER SOFTWARE, desarrollo de software a medida &#187; Procesos</title>
	<atom:link href="http://www.ender.es/category/procesos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ender.es</link>
	<description>Factoría de software</description>
	<lastBuildDate>Wed, 14 Jul 2010 10:36:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Modelo entidad-relación, un ejemplo práctico (I. Matriculación)</title>
		<link>http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/</link>
		<comments>http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 14:21:31 +0000</pubDate>
		<dc:creator>Domingo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Procesos]]></category>

		<guid isPermaLink="false">http://www.ender.es/?p=709</guid>
		<description><![CDATA[&#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook A&#241;dirlo a Google Reader Compartir con LinkedIn &#161;Comp&#225;rtelo en Twitter! &#161;Comp&#225;rtelo con Digg! En el desarrollo de software para empresas, el almacenamiento de la información de un modo organizado es fundamental&#8230; la mayoría de los casos en los que el programador contesta &#8220;no se<a href="http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/"> [Leer más ..]</a>]]></description>
			<content:encoded><![CDATA[

<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;t=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;srcUrl=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;srcTitle=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;snippet=En%20el%20desarrollo%20de%20software%20para%20empresas%2C%20el%20almacenamiento%20de%20la%20informaci%C3%B3n%20de%20un%20modo%20organizado%20es%20fundamental...%20la%20mayor%C3%ADa%20de%20los%20casos%20en%20los%20que%20el%20programador%20contesta%20%22no%20se%20puede%20hacer%22%20a%20un%20requerimiento%20de%20un%20cliente%20se%20debe%20a%20un%20error%20en%20el%20modelado%20de%20la%20base%20de%20datos%20que%20funciona" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;summary=En%20el%20desarrollo%20de%20software%20para%20empresas%2C%20el%20almacenamiento%20de%20la%20informaci%C3%B3n%20de%20un%20modo%20organizado%20es%20fundamental...%20la%20mayor%C3%ADa%20de%20los%20casos%20en%20los%20que%20el%20programador%20contesta%20%22no%20se%20puede%20hacer%22%20a%20un%20requerimiento%20de%20un%20cliente%20se%20debe%20a%20un%20error%20en%20el%20modelado%20de%20la%20base%20de%20datos%20que%20funciona&amp;source=ENDER SOFTWARE, desarrollo de software a medida" rel="nofollow" class="external" title="Compartir con LinkedIn">Compartir con LinkedIn</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29+-+http://b2l.me/z5gqs&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo con Digg!">&iexcl;Comp&aacute;rtelo con Digg!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<p>En el desarrollo de software para empresas, el almacenamiento de la información de un modo organizado es fundamental&#8230; la mayoría de los casos en los que el programador contesta &#8220;no se puede hacer&#8221; a un requerimiento de un cliente se debe a un error en el modelado de la base de datos que funciona como soporte a la aplicación. En este artículo voy a intentar explicar, con un ejemplo práctico, un buen modelado de datos.</p>
<p>Como, de alguna forma, estamos especializados en el software de gestión de empresas de enseñanza, voy a utilizar un ejemplo de uno de esos modelos: la gestión de matriculación de los alumnos, incluyendo los recibos que tienen que pagar, y el pago parcial de los mismos. Voy a explicar en este artículo el funcionamiento del proceso (para que podamos hacer el seguimiento de la implementación), las tablas que utilizamos y los campos (de forma resumida) que componen cada una de las tablas. De paso, daré una idea de los índices, procedimientos almacenados y triggers que nos pueden resultar útiles para que el rendimiento de la base de datos sea bueno.</p>
<h1>Descripción del proceso de matriculación (el caso de uso)</h1>
<p>Vamos a imaginarnos que nos encontramos en una academia de idiomas, en la que los alumnos se matriculan y asisten a clase de forma temporal. En este caso me voy a centrar en lo que se llaman &#8220;grupos abiertos&#8221;, es decir, grupos en los que cualquiera se puede matricular (en oposición a los grupos de empresa o grupos cerrados, que suelen funcionar de forma diferente).</p>
<p>Cuando llegamos a la academia, se nos ofrece un folleto o catálogo de productos y servicios, en el que se detallan los diferentes cursos en los que nos podemos matricular, y las diferentes formas de pago que podemos utilizar. Seleccionamos uno de los cursos, la forma de pago que más nos conviene, el horario al que vamos a asistir, y con esta información nos matriculamos. Como forma de pago, en este caso, vamos a utilizar un pago mensual, y queremos que se nos domicilie el pago a través de nuestra cuenta bancaria.</p>
<p>En la academia, llegado este punto, introducen en su sistema de información nuestros datos y nos imprimen el contrato de prestación de servicios, en el que se incluyen todos nuestros datos, el curso en el que nos hemos matriculado y todos los pagos que vamos a tener que realizar mientras estemos matriculados. Nos piden, de paso, que paguemos una reserva de plaza, que es una pequeña cantidad del primer recibo.</p>
<p>En el siguiente día de clase, nos presentamos, y el profesor comprueba en su hoja de asistencia que estamos incluidos en el grupo&#8230; nos da la bienvenida, y empezamos a estudiar.</p>
<h1>El modelo de datos</h1>
<p>A partir de aquí haré una descripción de la estructura de tablas y columnas para almacenar la información de este proceso. Primero, algunas generalidades sobre cómo crear los campos.</p>
<h2>Generalidades</h2>
<p>Hay algunas cosas básicas a la hora de modelizar el modelo de datos que usamos como convenciones (nomenclatura, cosas así). Por ejemplo:</p>
<ol>
<li>La clave primaria de las tablas siempre es un identificador autoincremental. Todas las tablas tienen así un identificador interno, mantenido por el sistema. Así, las claves ajenas son más fáciles de mantener.</li>
<li>En general, nosotros no solemos poner campos requeridos&#8230; preferimos hacer la gestión dentro de la lógica de negocio. Nunca se sabe lo que te vas a encontrar, y se nos han dado casos de campos de los que estábamos completamente seguros que eran requeridos y hemos tenido que quitar la marca.</li>
<li>No se duplica información. Es decir, una de las reglas básica es que la misma información no puede estar en dos sitios, salvo&#8230;</li>
<li>En muchos casos, creamos campos calculados, que permiten acceder de forma rápida a información&#8230; por ejemplo, el importe pendiente de un recibo, en realidad, se calcula como el importe total del recibo menos la suma de los pagos parciales&#8230; como hacer este cálculo cada vez que nos hace falta ralentiza el funcionamiento del sistema, hacemos un campo calculado que se mantiene automáticamente (en nuestro caso, a través de Triggers de la base de datos). La información está duplicada en dos sitios, sí, pero por motivos de rendimiento (y siempre está sincronizada).</li>
<li>En los nombres de los campos no ponemos caracteres especiales (ni acentos, ni espacios, etc.). Aunque el gestor de base de datos lo admita, no lo hacemos, porque luego nunca se sabe desde dónde vas a tener que acceder.</li>
</ol>
<h2>Descripción de las entidades</h2>
<p>El primer paso para hacer el modelo de datos es identificar las entidades (tablas) que vamos a tener. Según el caso de uso descrito, las tablas necesarias son las siguientes (al menos, son las que nosotros usamos):</p>
<ul>
<li><strong>Cursos: </strong>almacena la oferta formativa del centro. Representa el catálogo o folleto que te dan al llegar al centro.</li>
<li><strong>Formas de Pago: </strong>para cada curso, las distintas opciones de pago que existen (es parte del folleto también). Trimestral, mensual, anual, etc.</li>
<li><strong>Grupos:</strong> dentro de cada curso, los diferentes horarios a los que se puede asistir. En este caso, el modelo que utilizamos es bastante más complejo que el que voy a describir aquí&#8230; en un artículo posterior lo describiré en detalle.</li>
<li><strong>Clientes:</strong> el que paga&#8230; puede ser el mismo que el alumno, pero también puede que no.</li>
<li><strong>Medios de pago</strong>: Contiene los diferentes métodos que los clientes pueden usar para pagar (contado, domicilación bancaria, etc), incluyendo las cuentas bancarias del cliente.</li>
<li><strong>Alumnos: </strong>la gente que va a clase. Los clientes pueden ser empresas (personas jurídicas), los alumnos son personas físicas. Un mismo cliente puede tener múltiples alumnos.</li>
<li><strong>Matrículas: </strong>Refleja en qué curso nos matriculamos, las fechas, la forma de pago, etc. De forma física, se refleja en el contrato que te dan para firmar.</li>
<li><strong>Recibos:</strong> almacena los recibos que el cliente tiene que pagar (o ha pagado) en el centro.</li>
<li><strong>Pagos:</strong> esta tabla refleja los pagos que el cliente ha hecho (un recibo no necesariamente se paga de una vez). Como antes, la gestión de recibos y pagos que hacemos en realidad es más compleja de lo que voy a describir aquí. En otro artículo haré una descripción más completa.</li>
<li><strong>Alumnos en grupos</strong>: refleja los alumnos que están asignados a los distintos grupos. El alumno puede cambiar de grupo, y no queremos perder esa información histórica, así que necesitamos una tabla para gestionarlo.</li>
</ul>
<p>Aquí podéis ver el modelo gráficamente:</p>
<p><a rel="attachment wp-att-712" href="http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/modelo_entidad_relacion_matriculacion-2/"><img class="size-full wp-image-712 alignnone" title="Modelo entidad-relación para matriculación" src="http://www.ender.es/wp-content/uploads/2010/03/modelo_entidad_relacion_matriculacion1.png" alt="Modelo entidad-relación para matriculación" width="724" height="627" /></a></p>
<p>Con PK se marcan las claves primarias, y con FK, las claves ajenas&#8230; algunas líneas se cruzan, no lo puedo evitar. Las flechas indican que una tabla es &#8216;hija&#8217; de otra, con la punta de flecha apuntando al padre.</p>
<p>Como podéis ver, sólo están indicados los campos que forman el modelo de datos&#8230; las claves primarias y las claves ajenas, que en cualquier caso deben estar ocultas al usuario final. En la siguiente sección describiremos los campos de cada tabla.</p>
<h2>Campos para las entidades</h2>
<p>Sólo describiré los campos más importantes, y no incluiré los campos de clave primaria y ajena que se describen en el gráfico.</p>
<h3>Cursos</h3>
<ul>
<li>nombre: varchar(100)</li>
<li>descripcion: Memo. Se utilizará, en el contrato que se imprime para el cliente, para hacer una descripción larga del curso en el que el alumno se está matriculando. En uno de los sistemas que tenemos, en lugar de tener un campo memo, tenemos una tabla separada en la que se guardan, por tipologías, distintos campos memo, que se imprimen en distintos lugares del contrato.</li>
<li>fecha_inicio: date</li>
<li>fecha_fin: date</li>
</ul>
<h3>Formas de pago</h3>
<ul>
<li>nombre: varchar(100)</li>
<li>importe: float. Es el importe de cada recibo que se cobrará</li>
<li>numero_meses: integer. El número de meses de cada recibo. Si es 1, se creará un recibo cada mes mientras dure la matriculación, si es 3, uno cada tres meses, etc. En algún sistema hemos hecho, en lugar de esto, una estructura de plantillas de recibos, con fechas, descripciones, etc. personalizadas. Eso permite más flexibilidad y más control, pero el modelo es bastante más complejo.</li>
<li>numero_orden: integer. A la hora de presentárselo al cliente, poder mostrar primero las que más nos interesen.</li>
<li>importe_matricula: float. Si además del importe del curso hay un importe de matrícula, se marca aquí.</li>
<li>concepto_matricula. El concepto del recibo de matrícula, si creamos uno.</li>
</ul>
<h3>Grupos</h3>
<ul>
<li>nombre: varchar(100)</li>
<li>codigo: varchar(20). Siempre viene bien tener una codificación además del nombre. Por ejemplo, en algunos sistemas lo utilizamos para guardar el código del grupo en la Fundación Tripartita.</li>
<li>fecha_inicio: date</li>
<li>fecha_fin: date. Por defecto, las del curso al que pertenece el grupo, y además estas fechas no pueden estar fuera de las fechas del curso al que pertenecen.</li>
<li>lugar: varchar(100) de impartición del grupo. En general, hacemos una gestión de aulas, pero eso lo ampliaré en otro artículo.</li>
<li>notas: memo, del grupo</li>
<li>horario: varchar(100) del grupo. En realidad, el horario se trata como una tabla por debajo de esta, pero no voy a entrar en tanto nivel de detalle ahora.</li>
<li>maximo_alumnos: Integer. Máximo número de alumnos permitidos en el grupo.</li>
<li>numero_alumnos: Integer. Es el número de alumnos existentes en el grupo. Este campo es de sólo lectura para el usuario, y es calculado, a través de una serie de Triggers en la base de datos, para poder saber rápidamente el número de alumnos activos en cada grupo sin tener que estar sumando.</li>
</ul>
<h3>Clientes</h3>
<ul>
<li>nombre: varchar(100). En nuestros sistemas, normalmente, este es el único campo requerido (por código, no en la base) que tenemos. Así, el usuario puede dar de alta el registro aunque no tenga todos los datos, y volver después.</li>
<li>primer_apellido: varchar(100)</li>
<li>segundo_apellido: varchar(100)</li>
<li>nombre_completo: varchar(300): Esto es un campo calculado, que se mantiene con Triggers, para poder coger de forma rápida el conjunto Nombre+&#8217; &#8216;+primer_apellido+&#8217; &#8216;+segundo_apellido</li>
<li>direccion: memo</li>
<li>codigo_postal: varchar(20): no hay que ser tacaño&#8230; de vez en cuando hay que meter una dirección extranjera y el código postal puede ser más grande.</li>
<li>poblacion: varchar(50)</li>
<li>notas_internas: memo</li>
<li>etc. de datos personales (profesión, teléfonos, email, etc.)</li>
</ul>
<h3>Alumnos</h3>
<ul>
<li>nombre: varchar(100). Lo mismo que en clientes, pero lo requerido es nombre y primer apellido (en clientes es sólo nombre por si</li>
<li>primer_apellido: varchar(100)</li>
<li>segundo_apellido: varchar(100)</li>
<li>nombre_completo: varchar(300):</li>
<li>etc. de datos personales (profesión, teléfonos, email, etc.)</li>
</ul>
<h3>Medios de pago</h3>
<ul>
<li>tipo_medio: Integer. Normalmente tiene una tabla asociada con los tipos de medios de pago, que suelen ser: Sin Pago, Contado, Banco</li>
<li>nombre_titular: varchar(100)</li>
<li>direccion_titular: memo</li>
<li>entidad: varchar(4)</li>
<li>oficina: varchar(4)</li>
<li>dc: varchar(2)</li>
<li>numero_cuenta: varchar(10). Si el tipo_medio es banco, entonces se tiene que rellenar la información bancaria del cliente.</li>
<li>por_defecto: boolean. Se suele preguntar el medio de pago, pero teniendo uno por defecto, para no tener que rellenarlo siempre. Normalmente, cada cliente, al crearse, se crea un medio de pago &#8220;contado&#8221;, y se le pone por defecto.</li>
</ul>
<h3>Matrículas</h3>
<p>Además de los datos de curso, forma de pago, medio de pago, alumno y cliente (esto último puede parece redundante, pero no lo es&#8230; podemos tener el caso (yo lo he visto) de un alumno que se matricula para estudiar, digamos, inglés y francés&#8230; el inglés lo paga el padre y el francés la madre. Así, es necesario que cada matrícula esté asociada con el alumno, y también con el cliente), necesitamos los siguientes campos:</p>
<ul>
<li>fecha_inicio: date.</li>
<li>fecha_fin: date.  Por defecto, las del curso, pero hay gente que puede matricularse después o terminar antes (si se da de baja, por ejemplo).</li>
<li>importe: real. Por defecto, el de la forma de pago escogida, pero puede ser también distinto&#8230; descuentos por familiares, cosas así. Suele ser buena idea dejarlo abierto, para que el cliente lo pueda cambiar.</li>
<li>motivo_baja: varchar(100). Normalmente, los motivos de baja son una tabla separada, para luego poder obtener estadísticas de número de bajas por tipo, cosas así.</li>
</ul>
<h3>Recibos</h3>
<ul>
<li>fecha_emision: date</li>
<li>fecha_cobro_completo: date</li>
<li>numero_recibo: varchar(20)</li>
<li>concepto: varchar(50)</li>
<li>importe_recibo: float.</li>
<li>importe_pendiente: float. Es un campo de sólo lectura, actualizado a través de triggers, que permite acceder a la información sin tener que sumar.</li>
</ul>
<h3>Pagos</h3>
<ul>
<li>fecha: date</li>
<li>importe: real</li>
<li>forma_cobro: varchar(20). Normalmente es una tabla separada, igual que el caso de los tipos de baja. Puede ser: contado, transferencia, tarjeta, talón, etc.</li>
</ul>
<h3>Alumnos en grupos</h3>
<ul>
<li>fecha_inicio: date</li>
<li>fecha_fin: date. Suele ser una intersección entre la duración del grupo y la de la matrícula, pero cuando el alumno cambia de grupo, para una matrícula puede haber varios registros de alumnos en grupos. Hay que tener en cuenta también la posibilidad de que en un mismo curso, pagando más, un alumno pueda asistir a varios grupos (esto también lo he visto).</li>
</ul>
<h1>Triggers y procedimientos almacenados</h1>
<p>El modelo de datos y la lógica del negocio están muy estrechamente relacionados. Los sistemas de base de datos nos permiten desarrollar triggers y procedimientos almacenados, lo que es muy conveniente para dejar trozos de la lógica de negocio asociados con la base de datos, tanto por motivos de organización del código como por motivos de rendimiento (un procedimiento almacenado es varios órdenes de magnitud más rápido que hacer el mismo proceso a través de un lenguaje de programación).</p>
<p>En el ejemplo que estoy describiendo, hay varios triggers y procedimientos que se usan:</p>
<ul>
<li>Actualización de los campos &#8220;NombreCompleto&#8221; de alumnos y clientes: normalmente, es un trigger BEFORE INSERT y BEFORE UPDATE, que actualiza el campo en base al contenido del nombre y los apellidos.</li>
<li>Actualización del campo &#8220;ImportePagado&#8221; de recibos, AFTER INSERT, UPDATE y DELETE de pagos, que actualiza el campo ImportePendiente de recibos como la suma de los pagos de ese recibo.</li>
<li>Es habitual hacer un procedimiento CREARRECIBOS, que se ejecuta en el proceso de creación de la matrícula (o un trigger AFTER INSERT), que crea los recibos de la matrícula en base al importe y forma de pago seleccionadas.</li>
</ul>
<p>En las próximas semanas continuaré esta serie de artículos, describiendo otros submodelos de sistemas que hemos desarrollado&#8230; algunas ideas que tengo:</p>
<ol>
<li>Gestión de horarios y citas</li>
<li>Facturación</li>
<li>Gestión de horas trabajadas</li>
<li>Stock</li>
</ol>
<p>Cualquier otra idea será bienvenida&#8230;</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;t=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;srcUrl=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;srcTitle=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;snippet=En%20el%20desarrollo%20de%20software%20para%20empresas%2C%20el%20almacenamiento%20de%20la%20informaci%C3%B3n%20de%20un%20modo%20organizado%20es%20fundamental...%20la%20mayor%C3%ADa%20de%20los%20casos%20en%20los%20que%20el%20programador%20contesta%20%22no%20se%20puede%20hacer%22%20a%20un%20requerimiento%20de%20un%20cliente%20se%20debe%20a%20un%20error%20en%20el%20modelado%20de%20la%20base%20de%20datos%20que%20funciona" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29&amp;summary=En%20el%20desarrollo%20de%20software%20para%20empresas%2C%20el%20almacenamiento%20de%20la%20informaci%C3%B3n%20de%20un%20modo%20organizado%20es%20fundamental...%20la%20mayor%C3%ADa%20de%20los%20casos%20en%20los%20que%20el%20programador%20contesta%20%22no%20se%20puede%20hacer%22%20a%20un%20requerimiento%20de%20un%20cliente%20se%20debe%20a%20un%20error%20en%20el%20modelado%20de%20la%20base%20de%20datos%20que%20funciona&amp;source=ENDER SOFTWARE, desarrollo de software a medida" rel="nofollow" class="external" title="Compartir con LinkedIn">Compartir con LinkedIn</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29+-+http://b2l.me/z5gqs&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/&amp;title=Modelo+entidad-relaci%C3%B3n%2C+un+ejemplo+pr%C3%A1ctico+%28I.+Matriculaci%C3%B3n%29" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo con Digg!">&iexcl;Comp&aacute;rtelo con Digg!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.ender.es/2010/03/modelo-entidad-relacion-un-ejemplo-practico-i-matriculacion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Modelado de datos: ¿los límites del modelo entidad-relación?</title>
		<link>http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/</link>
		<comments>http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 15:35:28 +0000</pubDate>
		<dc:creator>Domingo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Procesos]]></category>

		<guid isPermaLink="false">http://www.ender.es/blog/?p=192</guid>
		<description><![CDATA[&#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook A&#241;dirlo a Google Reader Compartir con LinkedIn &#161;Comp&#225;rtelo en Twitter! &#161;Comp&#225;rtelo con Digg! Atributos Los campos del modelo entidad-relacion no siempre representan información sobre el modelo de negocio que están tratando. A menudo, son campos auxiliares que ayudan a la implementación del modelo dentro<a href="http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/"> [Leer más ..]</a>]]></description>
			<content:encoded><![CDATA[

<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.ender.es/2010/01/modelado-de-datos-¿los-limites-del-modelo-entidad-relacion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;t=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;srcUrl=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;srcTitle=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;snippet=Atributos%20Los%20campos%20del%20modelo%20entidad-relacion%20no%20siempre%20representan%20informaci%C3%B3n%20sobre%20el%20modelo%20de%20negocio%20que%20est%C3%A1n%20tratando.%20A%20menudo%2C%20son%20campos%20auxiliares%20que%20ayudan%20a%20la%20implementaci%C3%B3n%20del%20modelo%20dentro%20de%20la%20base%20de%20datos.%20Los%20atributos%20del%20modelo%20Clase-Colecci%C3%B3n%20representan%20siempre%20in" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;summary=Atributos%20Los%20campos%20del%20modelo%20entidad-relacion%20no%20siempre%20representan%20informaci%C3%B3n%20sobre%20el%20modelo%20de%20negocio%20que%20est%C3%A1n%20tratando.%20A%20menudo%2C%20son%20campos%20auxiliares%20que%20ayudan%20a%20la%20implementaci%C3%B3n%20del%20modelo%20dentro%20de%20la%20base%20de%20datos.%20Los%20atributos%20del%20modelo%20Clase-Colecci%C3%B3n%20representan%20siempre%20in&amp;source=ENDER SOFTWARE, desarrollo de software a medida" rel="nofollow" class="external" title="Compartir con LinkedIn">Compartir con LinkedIn</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F+-+http://b2l.me/z7vs8&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo con Digg!">&iexcl;Comp&aacute;rtelo con Digg!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<p>Atributos Los campos del modelo entidad-relacion no siempre representan información sobre el modelo de negocio que están tratando. A menudo, son campos auxiliares que ayudan a la implementación del modelo dentro de la base de datos. Los atributos del modelo Clase-Colección representan siempre información sobre el modelo de negocio. Si es necesario algún campo auxiliar en alguna tabla, es completamente transparente tanto para el usuario como para el analista (y en la mayoría de los casos para el desarrollador). Por otro lado, además de los tipos de datos clásicos en una base de datos (carácter, numérico, fecha, etc.) en este modelado se incluyen otros dos tipos de atributos. En general, en el modelo Clase-Colección existen tres tipos de atributos: Atributos de tipo valor, de tipo objeto y de tipo colección. La incorporación más importante del modelo clase-colección es la asociación de los atributos tipo objeto y tipo colección en parejas. Como decíamos antes, en el modelo entidad-relación las relaciones se ven siempre desde un único punto de vista a la hora de modelizar. Como en el mundo real, las relaciones en un modelo de negocio siempre tienen dos puntos de vista, y nuestro modelo de datos intenta representar eso. Una relación se representa por un par de atributos, enlazados entre sí. De esta forma, no hay que pensar en estructuras predefinidas y ver cuál se adapta mejor, sino analizar la realidad y representarla de la mejor forma posible. Más adelante lo veremos con más detalle. A continuación se hace una pequeña introducción a los tres tipos de atributos:Todos los que programamos sistemas de información para empresas tenemos que tener conocimientos de modelado de datos en bases de datos relacionales. Bases de datos y SQL son habilidades imprescindibles para nuestro trabajo.</p>
<p>Desde siempre ha habido cosas que no me han acabado de convencer del <a title="Modelo entidad-relación" href="http://es.wikipedia.org/wiki/Modelo_entidad-relación" target="_blank">modelo entidad-relación</a>, o mejor dicho, de la implementación que los sistemas de <a title="Bases de datos relacionales" href="http://es.wikipedia.org/wiki/Base_de_datos_relacional" target="_blank">bases de datos relaciones</a> hacen del mismo. Hay algunas cosas que no me han parecido naturales, y hemos desarrollado una teoría que, al menos a nosotros, nos ha servido los últimos 5 años para los proyectos que hemos desarrollado.</p>
<h2>Cosas raras en el modelo entidad-relación (con todo respeto)</h2>
<p>Nuestra teoría (la llamamos, a falta de un término mejor, el modelo objeto-colección) se basa dos ideas, aparentemente sin nada que ver una con la otra:</p>
<p>Primero, la programación orientada a objetos (estaba claro, habiendo en el título la palabra &#8220;objeto&#8221;). Segundo, la idea de que las relaciones siempre se pueden ver, de forma distinta, desde el punto de vista de las dos entidades involucradas&#8230;</p>
<p>En la implementación de una relación 1 a N entre dos tablas, la relación se establece creando una clave ajena que &#8216;apunta&#8217; a la tabla &#8216;madre&#8217;. Sin acceder a los metadatos de la base, no se puede saber, mirando una tabla, cuántas tablas están relacionadas con ella. Es como si la relación sólo se estuviera viendo desde el lado de la tabla &#8216;hija&#8217;, sólo desde un punto de vista. No nos &#8216;suena&#8217; bien.</p>
<p>Otra cosa es la implementación de las relaciones M..N. Implica la existencia de una tabla intermedia en la que se almacenan las duplas de claves ajenas que representan la relación. En teoría (nos enseñaban en la facultad), cada entidad tiene que tener una representación física en el sistema que estamos modelizando, y durante las clases se pasaba de puntillas por el hecho de que estas tablas eran &#8216;auxiliares&#8217;, que ayudaban a montar la relación pero no tenían existencia como entidades. Hmpf!</p>
<h2>Lo que hacemos</h2>
<p>Proponemos una forma similar, pero ligeramente diferente, de entender las relaciones, y una forma de implementarla utilizando los sistemas de base de datos relacionales existentes actualmente.</p>
<div id="_mcePaste">
<p>El modelo entidad-relación y las bases de datos relacionales están intimamente relacionados (como sus nombres indican) y todas las bases de datos modernas están orientadas en este sentido. Existen otras aproximaciones, como las bases de datos orientadas a objetos, pero su implantación en sistemas en producción es más bien escasa. Por otro lado, con esta técnica y un poco de imaginación se puede modelizar cualquier negocio que pueda presentarse. Por tanto, parece la metodología óptima para el desarrollo de aplicaciones de gestión. Sin embargo, presenta una serie de dificultades para la modelización.</p>
<p>Principalmente, la implementación de las relaciones, sobre todo las 1 a N , se basa en una representación desde un sólo punto de vista. La relación “todas las facturas tienen un cliente” también puede enunciarse “un cliente tiene n facturas”. A la hora de modelizar, esta dualidad de la representación puede crear problemas de identificación que afecten a la calidad del modelo creado.</p>
<p>Por otro lado, esta forma de trabajo “descubre” demasiado de la implementación al diseñador. Para hacer un buen diseño de base de datos el analista debe conocer hasta cierto punto el diseño de las bases de datos relacionales, lo que quizá sean demasiados requerimientos para alguien que debe dedicarse a modelizar procesos de negocio.</p>
<h2>El modelo Objeto-Colección</h2>
<p>El modelo se basa actualmente en una implementación similar del mismo, pero presentando las ideas de una forma diferente, extraída de la orientación a objetos, con el objetivo de facilitar tanto el diseño de los modelos de datos como su mantenimiento. En este modelo de datos se introducen varios cambios sobre el modelo entidad-relación:</p>
<h3>Clases</h3>
<p>El concepto de tabla se altera ligeramente en este modelo, y se asocia con el concepto de clase de la orientación a objetos. Una clase es una estructura que contiene tanto los datos como los procesos que se aplican a los mismos, y lo mismo se trata de hacer aquí. Además de una serie de atributos (que sustituyen a los campos, y que analizaremos posteriormente), una clase también posee una serie de métodos (o procesos que se aplican sobre sus datos) y consultas, o informes que presentan al usuario información sobre sus datos. Por otro lado, el modelo entidad-relación identifica una entidad con una tabla. En el modelo Clase-Colección no es necesariamente así. De hecho, la implementación actual, que no es la única y que puede cambiar, presenta cada clase como dos tablas y una secuencia.</p>
<h3>Atributos</h3>
<p>Los campos del modelo entidad-relacion no siempre representan información sobre el modelo de negocio que están tratando. A menudo, son campos auxiliares que ayudan a la implementación del modelo dentro de la base de datos. Los atributos del modelo Clase-Colección representan siempre información sobre el modelo de negocio. Si es necesario algún campo auxiliar en alguna tabla, es completamente transparente tanto para el usuario como para el analista (y en la mayoría de los casos para el desarrollador). Por otro lado, además de los tipos de datos clásicos en una base de datos (carácter, numérico, fecha, etc.) en este modelado se incluyen otros dos tipos de atributos. En general, en el modelo Clase-Colección existen tres tipos de atributos: Atributos de tipo valor, de tipo objeto y de tipo colección. La incorporación más importante del modelo clase-colección es la asociación de los atributos tipo objeto y tipo colección en parejas. Como decíamos antes, en el modelo entidad-relación las relaciones se ven siempre desde un único punto de vista a la hora de modelizar. Como en el mundo real, las relaciones en un modelo de negocio siempre tienen dos puntos de vista, y nuestro modelo de datos intenta representar eso. Una relación se representa por un par de atributos, enlazados entre sí. De esta forma, no hay que pensar en estructuras predefinidas y ver cuál se adapta mejor, sino analizar la realidad y representarla de la mejor forma posible. Más adelante lo veremos con más detalle. A continuación se hace una pequeña introducción a los tres tipos de atributos:</p>
<h4>Tipo valor</h4>
<p>Los atributos tipo valor se asocian con datos que vaya a escribir el usuario o información real del modelo de negocio. Dentro de los atributos tipo valor existen todos los tipos de datos especificados anteriomente (carácter, etc.). Por ejemplo, atributos tipo valor son el nombre de un cliente, su NIF, el número de una factura o la fecha de creación de una factura.</p>
<h4>Tipo objeto</h4>
<p>Los atributos tipo objeto tienen su origen en los campos de clave ajena que se utilizan en el modelo entidad- relación para implementar las relaciones. Son un enlace en una clase a un objeto de otra, de forma que se integra en la información de la clase como un atributo más, y se comporta como cualquier otro.</p>
<h4>Tipo colección</h4>
<p>Los atributos tipo colección representan un conjunto de objetos de otra clase, y son la incorporación de este tipo de modelado. Anteriormente, analizando aisladamente la clase Clientes es imposible saber que está relacionada con facturas. De esta forma, la ingeniería inversa de los modelos de datos se complica enormemente. Actualmente, la clase clientes tiene un atributo tipo colección llamado “Facturas”, de forma que es muy fácil identificar todas las relaciones que la clase clientes tiene con otras clases. Además, la relación se puede ver desde los dos lados. La factura tiene un cliente y el cliente tiene un conjunto de facturas.</p>
<h3>Implementación de las relaciones</h3>
<p>Al crear un atributo tipo objeto o colección, el sistema solicita al usuario la creación del atributo enlazado de la clase de destino, así se asegura la integridad del sistema.  Después a la hora de utilizar dichas relaciones, siempre se tratarán en parejas de forma transparente para el usuario. Por ejemplo, si se modifica el atributo “Cliente” de un objeto de la clase Facturas, y se cambia su enlace, el sistema automáticamente actualizará la colección de “Facturas” de los clientes implicados: Sacará la factura del cliente antiguo y la meterá en el nuevo. Este proceso ayuda bastante a la modelización de los datos, creandose así varios tipos de relaciones: Relaciones Objeto-Objeto En general no son recomendables, porque representan relaciones 1 a 1 que son erróneas normalmente, pero en algunas ocasiones son necesarias. Por ejemplo, la implementación de los pares de atributos (atributo y atributo enlazado), se hace a través de una relación objeto-objeto Relaciones Objeto-Colección Representan las relaciones 1 a N del modelo entidad-relación, con la salvedad que ambas clases incluyen una relación, los que ayuda a la comprensión del modelo de datos, a su mantenimiento y a la visualización por parte del usario. Relaciones Colección-Colección Representan las relaciones M a N del modelo entidad-relación, con la diferencia que no existen tablas intermedias o auxiliares, y resulta mucho más visual para todas las partes implicadas.</p>
</div>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.ender.es/2010/01/modelado-de-datos-¿los-limites-del-modelo-entidad-relacion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;t=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;srcUrl=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;srcTitle=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;snippet=Atributos%20Los%20campos%20del%20modelo%20entidad-relacion%20no%20siempre%20representan%20informaci%C3%B3n%20sobre%20el%20modelo%20de%20negocio%20que%20est%C3%A1n%20tratando.%20A%20menudo%2C%20son%20campos%20auxiliares%20que%20ayudan%20a%20la%20implementaci%C3%B3n%20del%20modelo%20dentro%20de%20la%20base%20de%20datos.%20Los%20atributos%20del%20modelo%20Clase-Colecci%C3%B3n%20representan%20siempre%20in" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F&amp;summary=Atributos%20Los%20campos%20del%20modelo%20entidad-relacion%20no%20siempre%20representan%20informaci%C3%B3n%20sobre%20el%20modelo%20de%20negocio%20que%20est%C3%A1n%20tratando.%20A%20menudo%2C%20son%20campos%20auxiliares%20que%20ayudan%20a%20la%20implementaci%C3%B3n%20del%20modelo%20dentro%20de%20la%20base%20de%20datos.%20Los%20atributos%20del%20modelo%20Clase-Colecci%C3%B3n%20representan%20siempre%20in&amp;source=ENDER SOFTWARE, desarrollo de software a medida" rel="nofollow" class="external" title="Compartir con LinkedIn">Compartir con LinkedIn</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F+-+http://b2l.me/z7vs8&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/&amp;title=Modelado+de+datos%3A+%C2%BFlos+l%C3%ADmites+del+modelo+entidad-relaci%C3%B3n%3F" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo con Digg!">&iexcl;Comp&aacute;rtelo con Digg!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.ender.es/2010/01/modelado-de-datos-%c2%bflos-limites-del-modelo-entidad-relacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
