Estoy diseñando esta base de datos que debe mantener un historial del salario de los empleados y los movimientos dentro de la organización. Básicamente, mi diseño tiene 3 tablas (es decir, hay más tablas, pero para esta pregunta mencionaré 3, así que tengan paciencia). Tabla de empleados (que contiene el sueldo más reciente, datos de posición, etc.), tabla de SalarioHistory (salario, fecha, razón, etc.) y MovementHistory (Título, Departamento, comentarios). Usaré Linq en Sql, entonces lo que estaba pensando es que cada vez que se actualicen los datos de los empleados, los valores anteriores se copiarán en sus respectivas tablas de historial. ¿Es este un buen enfoque? ¿Debo hacerlo usando Linq to SQL o disparadores? Gracias por cualquier ayuda, sugerencia o idea.mantener la historia en una base de datos
Respuesta
Eche un vistazo a http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture.
Básicamente, el artículo sugiere que tiene las siguientes columnas en las tablas que necesita para realizar un seguimiento de la historia de -
* DateCreated – the actual date on which the given row was inserted.
* DateEffective – the date on which the given row became effective.
* DateEnd – the date on which the given row ceased to be effective.
* DateReplaced – the date on which the given row was replaced by another row.
* OperatorCode – the unique identifier of the person (or system) that created the row.
DateEffective y DateEnd juntos le dirá el tiempo durante el cual la fila era válida (o el tiempo para lo cual un empleado estaba en un departamento, o el tiempo por el cual ganó un salario particular).
Es una buena idea mantener esa lógica interna en la base de datos: eso es básicamente por qué existen los activadores. Lo digo con cuidado, sin embargo, ya que hay muchas razones para mantenerlo externo. Muchas veces, especialmente con una tecnología tan fácil como LINQ-to-SQL, es más fácil escribir el código externamente. En mi experiencia, más personas podrían escribir esa lógica en C#/LINQ que podría hacerlo correctamente usando un disparador.
Los disparadores son rápidos, ¡están compilados! Sin embargo, son muy fáciles de utilizar mal y hacen que su lógica sea demasiado compleja en un grado tal que el rendimiento puede degradarse rápidamente. Teniendo en cuenta lo simple que es su caso de uso, Optaría por utilizar los factores desencadenantes, pero ese soy yo personalmente.
Gracias por su conocimiento :) – jasonco
Creo que este es el enfoque que voy a utilizar. No tengo mucha experiencia con disparadores. Quiero decir, todavía estoy aprendiendo linq a SQL pero me siento mucho más cómodo. – jasonco
No estoy de acuerdo con el comentario de "buena idea" pero no de la forma en que piensas. Estas reglas deben * siempre * estar en la base de datos para garantizar que los clientes de la base de datos las sigan. El DB debería ser una entidad en sí misma, proteger su propia integridad de datos, no depender de partes externas. +1 de todos modos. – paxdiablo
Los desencadenantes probablemente serán más rápidos, y no requieren un "intermediario" para realizar el trabajo, eliminando al menos una posibilidad de errores.
Dependiendo de su base de datos de elección, puede simplemente usar una tabla y habilitar los OID en ella, y agregar dos columnas más, "marcar" y "anterior". Nunca actualice esta tabla, solo inserte. Agregue un desencadenador para que cuando se agregue una fila para el empleado #id, establezca todos los registros con el empleado #id para tener un indicador de "anterior" y establezca el nuevo valor "anterior" de filas en la fila anterior.
¡Gracias por tu comentario! – jasonco
Los activadores hacen que su front-end sea más fácil de migrar a otra cosa y mantendrán la base de datos constante independientemente de cómo se inserten/actualicen/eliminen los datos.
Además, en su caso yo escribiría los salarios directamente en el historial salarial: según su descripción, no vería una razón por la que deba seguir el camino mediante un activador de actualización en la tabla de empleados.
Así lo hice primero, pero decidí usar la tabla histórica solo para la historia, nada actual. Quiero decir, estoy seguro de que hay bastantes formas de hacerlo. Estoy algo atrapado buscando la solución adecuada y no hay una solución correcta. jeje gracias por tu comentario. – jasonco
Creo que esto pertenece a la base de datos por dos razones.
Primero, los niveles intermedios van y vienen, pero las bases de datos son para siempre. Este año Java EJB, el próximo año .NET, el año después de eso, algo más. Los datos permanecen, en mi experiencia.
En segundo lugar, si la base de datos se comparte en absoluto, no debería tener que depender de cada aplicación que la usa para saber cómo mantener su integridad de datos. Consideraría esto como un ejemplo de encapsulación de la base de datos. ¿Por qué forzar el conocimiento y el mantenimiento de la historia en cada cliente?
Gracias, lo consideraré también. – jasonco
- 1. mantener la configuración en la base de datos
- 2. Mantener elasticsearch y la base de datos en sincronía
- 3. Migración de una base de datos segura Fuente a la subversión con la historia
- 4. Prevenir una devolución de datos aparezcan en la Historia
- 5. ¿Cómo puedo mantener segura una base de datos mySQL?
- 6. SVN cambio de base y la historia perdida
- 7. ¿Hay una herramienta de shell de Windows que pueda mantener la historia?
- 8. ¿Cómo se debe mantener una conexión de base de datos en una aplicación ASP.NET MVC?
- 9. ¿Mantener el estado en el servidor de aplicaciones o en la base de datos?
- 10. Cómo mantener el orden de los registros en una tabla de base de datos
- 11. Mantener la integridad referencial en múltiples bases de datos
- 12. Mantener datos persistentes en la memoria
- 13. HG: Deshacer una confirmación de la historia
- 14. bases de datos Mantener sincronizados distribuida en una red inestable
- 15. Mantener el contenido de la base de datos en el cambio de modelo
- 16. ¿Cómo puedo mantener mi base de datos en una tarjeta SD y usar ORMLite?
- 17. Estructuras de árbol en una base de datos nosql
- 18. Constantes base de datos en una clase
- 19. ¿Cómo mantener los datos en una base de datos SQLite en un iPhone en una actualización de la versión de la aplicación?
- 20. Copiar datos de una tabla en una base de datos a otra base de datos separada
- 21. Aplana la vieja historia en Git
- 22. ¿Crear una base de datos desde otra base de datos?
- 23. Convertir la base de datos de Postgres en una base de datos espacial
- 24. ¿Cómo vaciar una base de datos SQL?
- 25. Mantener posición de la página en la devolución de datos
- 26. integración continua: mantener el esquema de base de datos de prueba hasta a la fecha
- 27. ¿Es seguro mantener datos confidenciales en SQLite
- 28. ¿Es costoso mantener abiertas las conexiones a la base de datos?
- 29. Flex: ¿la mejor estrategia para mantener los datos del cliente sincronizados con la base de datos back-end?
- 30. Mantener la base de datos en sincronía con las imágenes en el sistema de archivos [PHP/PostgreSQL/Linux]
Enlace de interés - ¡buena lectura, gracias! – ChristopheD
Genial, ya tenía un patrón similar con respecto a las fechas. Gracias por tu publicación, ¡muy útil! – jasonco