Esquema relacional para expresiones temporales de Fowler -- sql campo con orm campo con scheduling campo con recurrence camp Relacionados El problema

Relational Schema for Fowler's Temporal Expressions


16
vote

problema

Español

Martin Fowler define un modelo de objeto elegante para la programación de tareas recurrentes aquí , que Mapas al código OO muy bien. El mapeo de este esquema de base de datos relacional para la persistencia, sin embargo, es complicado.

¿Puede alguien sugerir una combinación de esquema + SQL que encapsula toda la funcionalidad que describe, particularmente en la imagen en la página 11. Intersige y los sindicatos son bastante obvios: la complejidad radica en representar las "expresiones temporales", que toman parámetros variables y debe interpretarse de manera diferente, y luego combinar aquellos en un 'conjunto temporal'.

Para ser claro, hay muchas maneras de representar el concepto de eventos recurrentes en las bases de datos relacionales. Lo que me gustaría en la entrada de todos, es cómo asignar este modelo en particular.

Algunas opciones posibles:

  • mesas 'Meta' que definen el número y el uso de argumentos. Ugly, pero probablemente funciona. Sin embargo, solo es probable que haya un número limitado de formas de "expresión temporal", por lo que la flexibilidad extrema de estas ofertas es probablemente demasiado.
  • alguna forma de herencia de tabla, como apoyada por los postgres (y presumiblemente, otros) RBMS.

Serialización La lista de parámetros y almacenar el resultado en un VARCHAR () no es una solución, ya que ese método evita las consultas basadas en el conjunto :)

Original en ingles

Martin Fowler defines an elegant object model for the scheduling of recurring tasks here, which maps to OO code very nicely. Mapping this to a relational database schema for persistence, however, is tricky.

Can anyone suggest a schema + SQL combination that encapsulates all the functionality he describes, particularly in the image on page 11. Intersects and Unions are fairly obvious - the complexity lies in representing the 'Temporal Expressions', which take variable parameters and must be interpreted differently, and then combining those into a 'Temporal Set'.

To be clear, there are many ways to represent the concept of recurring events in relational databases. What I'd like everyone's input on is how to map this particular model.

Some possible options:

  • 'Meta' tables that define number of, and use of arguments. Ugly, but probably works. However, there is only likely to be a limited number of 'Temporal Expression' forms, so the extreme flexibility this offers is probably too much.
  • Some form of table inheritance, as supported by Postgres (and presumably, other) RBMS.

Serialising the parameter list and storing the result in a varchar() is not a solution as that method prevents set-based queries :)

           

Lista de respuestas

25
 
vote

Me temo que esta respuesta será una gran cantidad de referencias y muy poco código práctico, y ha pasado un tiempo desde la última vez que me metí, pero ...

Creo que las dos tecnologías que desea mezclar aquí son 'bases de datos activas' y 'bases de datos temporales' .

El primero sería útil para evaluar las reglas y así sucesivamente, y el segundo es útil para almacenar datos temporales y evaluar en cuándo es válido un cierto registro. Ambas son áreas de investigación bastante grandes, pero puede hacer la mayoría de las cosas temporales en SQL simple (siempre que su base de datos tenga un buen servicio de soporte de tiempo). La parte activa es más difícil en SQL, pero PostgreSQL al menos tiene reglas para ayudar ligeramente con esto. No sé sobre las demás bases de datos, pero la mayoría de ellos tiene la regla / desencadenante / apoyo de restricción que podrían traducirse a lo que está buscando.

bases de datos activas son bases de datos que pueden reaccionar a los cambios en los hechos que almacena el uso de reglas. Estas reglas se especifican en lenguajes específicos de implementación, pero para cada día discusión reglas de eventos-acción-acción ( Las reglas de ECA son comunes. Para obtener una introducción a los sistemas de base de datos activos, lea los artículos El sistema de gestión de la base de datos activo Manifiesto y Sistemas de base de datos activos . Para obtener más información sobre las reglas de ECA, consulte Eventos lógicos y reglas de ECA (las páginas están en orden inverso O_0) y eventos en un sistema de base de datos orientado a objetos activo .

procesamiento de eventos es un caso especial de manejo de reglas que se ocupa de cómo manejar eventos compuestos y desencadenar sus acciones de manera adecuada. Una lectura interesante con respecto a esto es eventos compuestos para bases de datos activas: semántica, contextos y detección y Anatomía de un detector de eventos compuestos . Ver también el procesamiento de eventos complejos sitio y el procesamiento de flujo de eventos y proceso complejo de eventos Artículos de Wikipedia .

bases de datos temporales se puede ver como una base de datos que puede entender el tiempo y, en particular, dos tipos específicos de tiempo; Tiempo válido y transacción. La época válida de un registro es el período de tiempo durante el cual ese registro es válido, y el tiempo de transacción de un registro es el momento durante el cual está presente en la base de datos. Como una buena introducción práctica, recomendaría el libro sobre cómo hacer las bases de datos temporales en SQL: Desarrollar aplicaciones de bases de datos orientadas al tiempo en SQL de Richard T. Snodgrass.

OterHWise, todo lo que puede querer saber sobre las bases de datos temporales se puede leer en Entradas de base de datos temporales para la enciclopedia de springer de sistemas de base de datos que es un documento bastante completo (que comenzaría en la entrada 'base de datos temporal'), pero para comenzar un poco más rápido, echa un vistazo al Glosario de la base de datos temporal que es bastante más fácil de navegar y leer, y el sitio centro de tiempo cuya parte de publicaciones tiene (o hice ...) enlaces a la mayoría de las publicaciones notables en el área. < / p>

Así que, ahora que sabe todo sobre esto, se ve rápidamente que la imagen en la página 11 se puede expresar como un evento compuesto, y se puede detectar / evaluar como tal siempre que haya implementado el subconjunto requerido adecuado de un detector de eventos compuestos , y el resto podría expresarse como entradas en tablas con aspectos temporales:

Martin Fowler aborda gran parte de esto mismo en su Patrones para cosas que cambian con el tiempo que resume Muchos patrones que se ocupan del tiempo.

Al final, probablemente crearía un esquema de base de datos para la información temporal y usaría las reglas de DB para las partes activas o implementar esa parte en la aplicación (aunque hay dragones). Si usa PostgreSQL, los mecanismos de reglas se describen en el sistema de reglas parte de los docs.

mucho para leer, pero si entiendes a fondo todo esto, su patrimonio neto profesional puede subir bastante :)

Además, los buenos términos para Google son 'Base de datos temporal', 'Base de datos activa', 'ECA REGLA'.

 

I'm afraid this answer will be a lot of references and very little practical code, and it has been a while since I last messed with this, but...

I think the two technologies you want to mix here are 'active databases' and 'temporal databases'.

The first would be useful for evaluating the rules and so on, and the second is useful to store temporal data and evaluate at when a certain record is valid. Both of these are pretty large research areas, but you can do most of the temporal stuff in plain SQL (provided your database has good time support). The active part is harder in SQL, but PostgreSQL at least has rules to help slightly with this. I don't know about the others databases, but most of them has rule/trigger/constraint support that would be able to translate to what you are looking for.

Active databases are databases that can react to changes in the facts that it stores using rules. These rules are specified in implementation specific languages, but for every day discussion Event-Condition-Action rules (ECA Rules) are common. For an introduction to active database systems read the articles The Active Database Management System Manifesto and Active Database Systems. For some more information on ECA rules, check out Logical Events and ECA Rules (the pages are in reverse order o_0) and Events in an Active Object-Oriented Database System.

Events processing is a special case of the rule handling dealing with how to handle composite events and trigger their actions appropriately. An interesting read regarding this is Composite Events for Active Databases: Semantics, Contexts and Detection and Anatomy of a Composite Event Detector. Also see the Complex Event Processing site and the Event Stream Processing and Complex Event Processing wikipedia articles.

Temporal databases can be seen as a database that can understand time, and in particular two specific kinds of time; valid-time and transaction-time. The valid-time of a record is the time period during which that record is valid, and the transaction-time of a record is the time during which it is present in the database. As a good practical introduction I'd recommand the book on how to do temporal databases in SQL: Developing Time-Oriented Database Applications in SQL by Richard T. Snodgrass.

Oterhwise, everything you might possibly want to know about temporal databases can be read in Temporal Database Entries for the Springer Encyclopedia of Database Systems which is a pretty comprehensive document (I would start at the 'Temporal Database' entry), but to get started a bit quicker, check out the Temporal Database Glossary which is rather easier to browse and read, and the site Time Center whose publications part has (or did have...) links to most notable publications in the area.

So, now that you know all about this you see quickly that the image on page 11 can be expressed as a composite event, and can be detected/evaluated as such provided you have implemented the proper required subset of a composite event detector, and the rest could be expressed as a entries in tables with temporal aspects :)

Martin Fowler addresses much of this himself in his Patterns for things that change with time that summarizes many patterns that deals with time.

In the end, I would probably create a database schema for the temporal information and either use the DB rules for the active parts or implement that part in the application (there be dragons though). If you use PostgreSQL, the rule mechanisms are described in The Rule System part of the docs.

Much to read, but if you thoroughly understand all this your professional net worth can go up quite a bit :)

Also, good terms to google are 'temporal database', 'active database', 'ECA Rule'.

 
 
     
     
2
 
vote

SQL es un idioma para consultar conjuntos de datos. No admite fácilmente la codificación de operaciones lógicas específicas de dominio. En otras palabras, "La regla a ser evaluada" no es un tipo de datos en SQL. Ese es un concepto orientado a objetos, que tanto los datos como la lógica son componentes de una instancia de objeto.

Entonces, diría que lo más que podría hacerlo dentro del paradigma SQL sería almacenar 365 filas, correspondientes a los días del año, y un valor verdadero / falso para si el día respectivo satisface Los criterios del calendario recurrente. Por lo tanto, tiene que usar la lógica de OO que implementa el modelo de Fowler para realizar el cálculo, y almacenar las filas de 365 resultantes.

Luego, cuando necesite saber "es hoy (o alguna fecha en la fecha) de la programación?" Es muy fácil buscar la fila apropiada y verifique la columna verdadera / falsa. Almacenamiento de 365 filas por año es trivial para cualquier base de datos.

Esto puede parecer engañar, pero como dije, SQL se trata de conjuntos de datos, no lógica.

 

SQL is a language for querying sets of data. It doesn't easily support encoding of domain-specific logic operations. In other words, "rule to be evaluated" is not a data type in SQL. That's an object-oriented concept, that both data and logic are components of an object instance.

So I would say the most you could do within the SQL paradigm would be to store 365 rows, corresponding to the days of the year, and a true/false value for whether the respective day satisfies the criteria of the recurring schedule. So you have to use OO logic implementing Fowler's model to make the calculation, and store the resulting 365 rows.

Then when you need to know "is today (or any given date) part of the schedule?" it's very easy to look up the appropriate row and check the true/false column. Storing 365 rows per year is trivial for any database.

This may seem like cheating, but like I said, SQL is about sets of data, not logic.

 
 
     
     

Relacionados problema

1  Que tiene un orden superior de crecimiento, c.n. (log (base 1.5) n) o d. (N ^ (log (base 1.5) 2))  ( Which has a higher order of growth c n log base 1 5 n or d nlog base 1 ) 
Estaba mirando un ejemplo de un libro. La ecuación final llega a (C⋅n log (base 1.5) n) + d. (N ^ (log (base 1.5) 2)). Supongo que la segunda función tiene un...

4  Tiempo de ejecución de la función GCD recursivamente (algoritmo Euclid)  ( Running time of gcd function recursively euclid algorithm ) 
Solo he podido encontrar publicaciones sobre cómo implementar la función GCD tanto de manera recursiva e inerativamente, sin embargo, no pude encontrar esta. ...

34  Determinar las complejidades dados códigos  ( Determining the complexities given codes ) 
Dado un snipplet de código, ¿cómo determinará las complejidades en general? Me encuentro muy confundido con las preguntas importantes. Por ejemplo, una pregun...

3  ¿Cómo puedo implementar esta ecuación en Java?  ( How can i implement this equation in java ) 
OK, esto es más de una pregunta de seguimiento: ¿Cómo calcular las rutas óptimas para el vendedor de viajes BITONIC TOUR? En primer lugar, para la gira bi...

5  Complejidad de BIG-O de C ^ N + N * (LOGN) ^ 2 + (10 * N) ^ C  ( Big o complexity of cn nlogn2 10nc ) 
Necesito derivar la complejidad de BIG-O de esta expresión: c ^ n + n * (log (n)) ^ 2 + (10 * n) ^ C donde C es una constante y n es una variable. Esto...

1  ¿La complejidad del tiempo de la siguiente ecuación de recurrencia?  ( Time complexity of the following recurrence equation ) 
Hola, todos estoy teniendo problemas para calcular la complejidad de la siguiente ecuación de recurrencia: T(n)={ O(1) , if n<=2 ...

1  ¿Encontrar la relación de recurrencia de este algoritmo?  ( Find recurrence relation of this algorithm ) 
Suponiendo n = B-A + 1, necesito derivar la relación de recurrencia de este algoritmo: void recurringalgorithm(int *a, int A, int B){ if (A == B){ fo...

12  ¿Cómo determinar la altura de un árbol de recursión de una relación de recurrencia?  ( How to determine the height of a recursion tree from a recurrence relation ) 
¿Cómo se hace frente a determinar la altura de un árbol de recursión, construido al tratar con las horas de ejecución de la recurrencia? ¿Cómo difiere de dete...

0  ¿Cómo resuelves esta recurrencia?  ( How do you solve this recurrence ) 
T(n) = n + T(3n/4) + 2T(n/8) ¿Cómo resolvemos esta recurrencia? Cuando uso el método de sustitución, haga que el tiempo de ejecución sea O (n), pero la r...

231  ¿Cuál es la mejor manera de modelar eventos recurrentes en una solicitud de calendario?  ( Whats the best way to model recurring events in a calendar application ) 
Estoy construyendo una aplicación de calendario de grupo que necesita para apoyar los eventos recurrentes, pero todas las soluciones que he llegado a manejar ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos