2009-03-27 12 views
5

Estoy interesado en ver sugerencias para un diseño de base de datos con respecto al horario comercial.Diseño de la base de datos: ¿la mejor manera de mostrar el horario disponible?

Sería bastante similar a lo que Facebook tiene - alt text http://uploader.ws/upload/200903/widget.png

tengo una lista de negocios, y me gustaría que los usuarios sean capaces de introducir múltiples conjuntos de horas disponibles para ese negocio. por ejemplo,

Lunes: abrir 9-5; Martes: abierto 9-12; 1-5; etc. No me gustaría estar limitado a dos juegos de horas por día. Idealmente, N conjuntos de horas por día. Si eso no es práctico, no más de 4 ... no menos de 2.

Me interesan las "mejores" soluciones (teóricas) y las más prácticas.

El DBMS que estoy usando es MySQL.

Respuesta

6

¿Qué tal:

create table business (
    id int not null auto_increment primary key, 
    name varchar(255) 
); 

create table open_hour_range (
    id int not null auto_increment primary key, 
    business_id int, 
    day_of_week tinyint, /* 0-6 */ 
    open_time time, 
    close_time time, 
    foreign key(business_id) references business(id) 
); 

Esto le permite a cualquier combinación de horas, incluyendo múltiples por día. Sin embargo, puede ser un poco lento desde una perspectiva de consulta, en el sentido de que tendrá que hacer una buena cantidad de reuniones para llegar a la lista de las horas que una empresa está abierta.

Además, si usted quiere ser capaz de mostrar hora en un formato como:

MF 9-5 Sa-Su 9-12

Se necesitaría para fusionar los rangos similares en código, fuera de la base de datos. Si deseaba combinar este tipo, podría cambiar day_of_week por un start_day y un end_day.

+1

Esto es similar a lo que iba a publicar. Sin embargo, no consideraría que las uniones fueran un problema ... Haría una única consulta por separado para seleccionar todos los intervalos de horas aplicables para una empresa y dejar que el código de la aplicación maneje el formato. Siempre puedes almacenar en caché la salida también. – zombat

+0

¿Cuál es el beneficio de la columna open_hour_range.id? –

+0

La columna open_hour_range.id ofrece una manera de identificar de forma única un open_hour_range en particular para la actualización/eliminación. Esto puede ser un mal hábito: supongo que podría hacer que el conjunto completo de columnas de la tabla sea la clave principal. –

0

Con Microsoft SQL Server base de datos que puede almacenar esos datos como XML con y aún así ser capaz de ordenar y datos serach en base a uno o más valores de ese campo. Realice los cálculos, si es necesario, etc.

un valor en esa columna podría ser similar a esto:

<businessDays> 
    <monday> 
     <hours from="12" to="15" /> 
     <hours from="16" to="21" /> 
    </monday> 
    <friday> 
     <hours from="13" to="15" /> 
     <hours from="16" to="18" /> 
     <hours from="19" to="21" /> 
    </friday> 
</businessDays> 

referencias en XML con tipo:

referencias en indexación y XML quering datos en SQL Server:

en su aplicación que podrían serializar/deserializar estos datos en y desde los objetos de negocio.

Extremadamente simple y eficiente.

+0

¿Por qué sería eso una ventaja? –

+0

Solo se utiliza 1 columna para almacenar estos datos sin textura. En la aplicación, puede deserializarla en una entidad comercial utilizando las características de serialización/deserialización de .NET. Si divide esos datos en varias columnas o incluso tablas como otros chicos, sugiera -> el resultado se "sobrenormaliza" –

+0

Lo siento, etiqueté la pregunta como MySQL pero no especifiqué eso como un requisito en la pregunta. Actualizando la pregunta. – andyhky

3

Un pequeño ajuste al modelo de Scotty Allen:

mesa de negocios:
id - int
business_name - cadena
open_hour_range tabla:
id - int
business_id - int // clave externa a la empresa
days_of_week- int // (máscara de bits) 1-127
open_time - tiempo
CLOSE_TIME - tiempo

+0

Ooh, me gusta la idea de la máscara de bits - inteligente :) –

0

Me gusta más usar datetime en las columnas open_time y close_time. Es para reuniones que comenzarán de noche y finalizarán en la mañana del día siguiente. :)

Cuestiones relacionadas