Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modelo Entidad-Relacion Otro Ejemplo
Modelo Entidad-Relacion Otro Ejemplo
El modelo de datos
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.
Generalidades
Hay algunas cosas básicas a la hora de modelizar el modelo de datos que usamos como
convenciones (nomenclatura, cosas así). Por ejemplo:
Como podéis ver, sólo están indicados los campos que forman el modelo de datos… 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.
Cursos
nombre: varchar(100)
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.
fecha_inicio: date
fecha_fin: date
Formas de pago
nombre: varchar(100)
importe: float. Es el importe de cada recibo que se cobrará
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.
numero_orden: integer. A la hora de presentárselo al cliente, poder mostrar primero
las que más nos interesen.
importe_matricula: float. Si además del importe del curso hay un importe de
matrícula, se marca aquí.
concepto_matricula. El concepto del recibo de matrícula, si creamos uno.
Grupos
nombre: varchar(100)
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.
fecha_inicio: date
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.
lugar: varchar(100) de impartición del grupo. En general, hacemos una gestión de
aulas, pero eso lo ampliaré en otro artículo.
notas: memo, del grupo
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.
maximo_alumnos: Integer. Máximo número de alumnos permitidos en el grupo.
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.
Clientes
Alumnos
Medios de pago
tipo_medio: Integer. Normalmente tiene una tabla asociada con los tipos de medios
de pago, que suelen ser: Sin Pago, Contado, Banco
nombre_titular: varchar(100)
direccion_titular: memo
entidad: varchar(4)
oficina: varchar(4)
dc: varchar(2)
numero_cuenta: varchar(10). Si el tipo_medio es banco, entonces se tiene que
rellenar la información bancaria del cliente.
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 “contado”, y se le pone por defecto.
Matrículas
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… podemos tener el caso (yo lo he visto) de un
alumno que se matricula para estudiar, digamos, inglés y francés… 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:
fecha_inicio: date.
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).
importe: real. Por defecto, el de la forma de pago escogida, pero puede ser también
distinto… descuentos por familiares, cosas así. Suele ser buena idea dejarlo abierto,
para que el cliente lo pueda cambiar.
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í.
Recibos
fecha_emision: date
fecha_cobro_completo: date
numero_recibo: varchar(20)
concepto: varchar(50)
importe_recibo: float.
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.
Pagos
fecha: date
importe: real
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.
Alumnos en grupos
fecha_inicio: date
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).
Triggers y procedimientos almacenados
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).
En el ejemplo que estoy describiendo, hay varios triggers y procedimientos que se usan: