2012-08-11 13 views
5

He visto este tipo de problemas varias veces y estoy tratando de decidir la mejor manera de almacenar rangos de manera que no se solapen. Por ejemplo, al programar algún tipo de recurso que solo una persona puede usar a la vez. Sobre todo lo que he visto es algo como esto:Método sugerido para manejar rangos no solapados (por ejemplo, programación)

PERSON   ROOM  START_TIME  END_TIME 
Col. Mustard Library  08:00   10:00 
Prof. Plum  Library  10:00   12:00 
  1. ¿Cuál es la mejor manera de prevenir nuevas entradas de la superposición de una programación existente, como dicen si la señorita Escarlata quiere reservar la biblioteca de 11:00 a 11:30? Una restricción en línea no funcionará y no creo que esto pueda hacerse fácilmente en un desencadenante. ¿Un procedimiento que maneja todas las inserciones que inicialmente busca un conflicto existente en la tabla?

  2. En segundo lugar, ¿cuál es la mejor manera de manejar problemas de simultaneidad? Supongamos que la señorita Scarlet quiere la biblioteca de 13:00 a 15:00 y la Sra. White la quiere de 14:00 a 16:00. El procedimiento de (1) consideraría que ambos horarios son aceptables, pero tomados en conjunto, no lo son. Lo único que se me ocurre es el bloqueo manual de la mesa o algún tipo de mutex.

  3. ¿Cuál es una buena clave principal para la tabla de arriba, (room, start_time)?

+0

duplicado posible de [Cuál es la mejor manera de optimizar el esquema para capturar datos de asistencia] (http://stackoverflow.com/questions/3193227/what-is-the-best-way-to-optimize-schema-for -capturing-attendance-data) – APC

Respuesta

4

forma de trabajo rápida para los casos en los que haya intervalos de tiempo fijos, puede almacenar todos los rangos de la tabla separada entonces simplemente enlazarlo a la mesa "reservas". Puede hacer el truco para rangos fijos, por ejemplo, puede reservar la biblioteca solo con un intervalo de 30 minutos y el horario de trabajo es de 8 a.m. a 8 p.m., solo se necesitan 24 registros.

--Person table--------------- 
ID PERSON   ROOM 
1 Col. Mustart Library 
2 Proof. Plum Library 

--Timeshift table------------ 
ID START_TIME END_TIME 
1 08:00  08:30 
2 08:30  09:00 
.... 
24 19:30  20:00 

--Occupy table---- 
DATE   TIMESHIFT PERSON 
TRUNC(SYSDATE) TS_ID  P_ID 
08/12/2012   4   1 
08/12/2012   5   1 
08/12/2012   9   2 
08/12/2012   10   2 

Ahora lo hace PK o UK y su verificación basada en la base de datos está lista. Será rápido, con poca carga de datos. Sin embargo, usar la misma rutina por cada segundo no será tan efectivo.

La manera más universal y compleja es dejar algún procedimiento (o desencadenar) verificar, su rango está ocupado o no y deberá verificar todos los registros actuales.

+0

+1, crea una tabla de pequeños intervalos de tiempo discretos y permite a las personas reservar muchos. – Ben

Cuestiones relacionadas