Antecedentes
Soy estudiante de CS de primer año y trabajo a tiempo parcial para la pequeña empresa de mi padre. No tengo experiencia en el desarrollo de aplicaciones del mundo real. He escrito guiones en Python, algunos cursos en C, pero nada como esto.
Mi papá tiene un pequeño negocio de capacitación y actualmente todas las clases se programan, graban y siguen a través de una aplicación web externa. Hay una función de exportación / "informes" pero es muy genérica y necesitamos informes específicos. No tenemos acceso a la base de datos real para ejecutar las consultas. Me han pedido que configure un sistema de informes personalizado.
Mi idea es crear las exportaciones genéricas de CSV e importarlas (probablemente con Python) en una base de datos MySQL alojada en la oficina todas las noches, desde donde puedo ejecutar las consultas específicas que se necesitan. No tengo experiencia en bases de datos, pero entiendo los conceptos básicos. He leído un poco sobre la creación de bases de datos y los formularios normales.
Podemos comenzar a tener clientes internacionales pronto, así que quiero que la base de datos no explote si eso sucede. Actualmente también tenemos un par de grandes corporaciones como clientes, con diferentes divisiones (por ejemplo, empresa matriz de ACME, división de atención médica de ACME, división de cuidado corporal de ACME)
El esquema que se me ocurrió es el siguiente:
- Desde la perspectiva del cliente:
- Clientes es la mesa principal
- Los clientes están vinculados al departamento para el que trabajan
- Los departamentos se pueden dispersar por un país: RRHH en Londres, Marketing en Swansea, etc.
- Los departamentos están vinculados a la división de una empresa.
- Las divisiones están vinculadas a la empresa matriz.
- Desde la perspectiva de las clases:
- Sesiones es la mesa principal
- Un profesor está vinculado a cada sesión.
- Se proporciona un statusid a cada sesión. Por ejemplo, 0: completado, 1: cancelado
- Las sesiones se agrupan en "paquetes" de un tamaño arbitrario
- Cada paquete se asigna a un cliente
- Sesiones es la mesa principal
"Diseñé" (más bien garabateó) el esquema en una hoja de papel, tratando de mantenerlo normalizado a la 3ra forma. Luego lo conecté a MySQL Workbench y lo hizo todo bonito para mí:
( Haga clic aquí para ver el gráfico a tamaño completo )
(fuente: maian.org )
Consultas de ejemplo que estaré ejecutando
- Qué clientes con crédito aún quedan están inactivos (aquellos sin una clase programada en el futuro)
- ¿Cuál es la tasa de asistencia por cliente / departamento / división (medida por la identificación de estado en cada sesión)
- ¿Cuántas clases ha tenido un maestro en un mes?
- Marcar clientes que tienen baja tasa de asistencia
- Informes personalizados para departamentos de recursos humanos con tasas de asistencia de personas en su división
Pregunta (s)
- ¿Esto es de ingeniería excesiva o me dirijo en la dirección correcta?
- ¿La necesidad de unir varias tablas para la mayoría de las consultas dará como resultado un gran éxito en el rendimiento?
- He agregado una columna 'última sesión' a los clientes, ya que probablemente será una consulta común. ¿Es una buena idea o debería mantener la base de datos estrictamente normalizada?
Gracias por tu tiempo
divisions
tiene una columna llamada divisionid
. ¿No te parece redundante? Solo nómbralo id
. también sus nombres de tabla, incluidos _has_
: eliminaría eso y solo lo nombraría, por ejemplo cities_departments
. sus DATETIME
columnas deben ser de tipo a TIMESTAMP
menos que sean valores ingresados por el usuario. Creo que es una buena idea tener las tablas cities
y countries
. puede tener problemas para limitar las tablas a una sola status
. considere usar un INT
y realice comparaciones bit a bit en él, para que pueda tener más significado allí