Estoy creando una aplicación de administración para ayudar a administrar mi compañía de auto detallando móviles (y con suerte otros). Estoy luchando para descubrir cómo modelar algunos de los datos.Nombramientos y líneas de pedido
Esta pregunta está relacionada con una pregunta anterior que he publicado, pero he reproduce a continuación la información relevante: Database design - google app engine
En esta aplicación, hay conceptos de "Citas" y "Elementos de línea. "
Las citas son un lugar y una época donde se espera que los empleados estén para prestar un servicio.
Las líneas de pedido son un servicio, tarifa o descuento y su información asociada. Un ejemplo de artículos de línea que podrían entrar en una cita:
Name: Price: Commission: Time estimate Full Detail, Regular Size: 160 75 3.5 hours $10 Off Full Detail Coupon: -10 0 0 hours Premium Detail: 220 110 4.5 hours Derived totals(not a line item): $370 $185 8.0 hours
En mi aplicación previa de esta aplicación, Elementos de línea estuviera contenida por una sola cita. Esto funcionó bien la mayor parte del tiempo, pero a veces causaba problemas. Un ejemplo sería si una cita se interrumpió a mitad de camino debido a la lluvia y el técnico tuvo que volver al día siguiente y terminar. Esta situación requirió dos citas para la misma línea de pedido. En casos como este, me gustaría cambiar los datos un poco configurando la "línea de pedido" en la segunda cita para leer algo así como "Terminar" y luego el costo sería de $ 0.
En esta nueva versión, estoy considerando permitiendo Elementos de línea para ser emparejado con más de una cita con una estructura de tabla que tiene este aspecto:
Appointment
start_time
etc...
Line_Item
appointment_Key_List
name
price
etc...
Un problema general con esta estructura es que es complicado y ni siquiera estoy seguro de si es apropiado hacer coincidir una línea de pedido con varias citas. Si los artículos de línea solo pueden ser parte de una cita, entonces puedo poner una lista de artículos de línea en cada cita, cuando reciba las citas, ya recibiré artículos de línea.
Un problema más específico es que estoy usando el motor de la aplicación de Google y si quiero consultar un conjunto de citas y sus líneas de pedido asociadas, primero tendría que consultar el conjunto de citas y luego hacer un segundo consulta de las líneas de pedido utilizando el operador IN para comprobar si alguna de las claves de cita de Line_Item pertenece al conjunto de claves de cita que se devolvieron de la consulta anterior. La segunda consulta fallará si tengo más de 30 claves que me obliguen a fragmentar la consulta. Podría desnormalizar los datos para evitar esta complicada y extensa consulta de lectura, y probablemente tendré que desnormalizarme hasta cierto punto de todos modos, pero preferiría evitar la complejidad cuando sea apropiado.
Mi pregunta es ¿cómo se modela este tipo de situación? ¿Es apropiado incluso que un artículo de línea se combine con más de una cita, o es normal simplemente dividir los artículos de línea en apartados para cada cita, como "1ª mitad de 2 días de trabajo" y "2ª mitad de trabajo de dos días"? " ¿Cómo hacen esto aplicaciones similares exitosas? ¿Cuáles son las reglas generales en este tipo de situaciones? ¿Qué implementaciones han resultado menos problemáticas?
Gracias!
¡Respuesta muy informativa! Gracias por compartir esta información con SO. @DutrowLLC marque esta respuesta como la correcta, ya que, en mi opinión, es una respuesta mucho mejor a su pregunta. @Nick Johnson Mis disculpas por creer las cosas equivocadas. ¡Gracias por explicar y proporcionar esta muy buena respuesta con excelente información para todos! – Pindatjuh
@Pindatjuh - Es mucho para asimilar. Este video también entra en detalles sobre cómo se indexan las listas y la búsqueda. Encontré la segunda mitad en fusión-unión extremadamente útil. Era un pdf con diapositivas que puede ver mientras mira el video: http://code.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html –
Gracias por tomarse el tiempo para responder a esta pregunta tan a fondo , Espero que otras personas también puedan encontrar su respuesta y beneficiarse de ella. –