Reserva no banco de dados
Um banco de dados para um sistema de locação, a real finalidade é o cliente vai fazer a solicitação do veiculo em uma dataInicial com horaInicial e dataFinal com horaFinal da reserva. Como posso separar veiculos disponiveis para as demais reservas? ou seja, veiculo 1 reservado para 15/07/2015 as 08:00 até 15/07/2015 até as 13:00. Se outro cliente querer reservar um veiculo, esse veiculo 1 so pode aparecer disponivel depois dessa data e horario, mostrando apenas os demais veiculos que não tem reserva nesse periodo. Acho que consegui explicar.
Tabelas do sistema:
A estrutura do banco está correta?
Tabelas do sistema:
CREATE TABLE IF NOT EXISTS `reservas` ( `id_reserva` int(10) NOT NULL AUTO_INCREMENT, `datainicial` date DEFAULT NULL, `datafinal` date DEFAULT NULL, `horainicial` time DEFAULT NULL, `horaaprox` time DEFAULT NULL, `rota` text, `cidades_id_cidade` int(10) NOT NULL, `setores_id_setor` int(10) NOT NULL, `usuarios_id_usuario` int(10) NOT NULL, `regioes_id_regiao` int(10) NOT NULL, `veiculos_id_veiculo` int(10) NOT NULL, `motoristas_id_motorista` int(10) NOT NULL, PRIMARY KEY (`id_reserva`), KEY `fk_reservas_cidades1_idx` (`cidades_id_cidade`), KEY `fk_reservas_setores1_idx` (`setores_id_setor`), KEY `fk_reservas_usuarios1_idx` (`usuarios_id_usuario`), KEY `fk_reservas_regioes1_idx` (`regioes_id_regiao`), KEY `fk_reservas_veiculos1_idx` (`veiculos_id_veiculo`), KEY `fk_reservas_motoristas1_idx` (`motoristas_id_motorista`) ) ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `veiculos` ( `id_veiculo` int(10) NOT NULL AUTO_INCREMENT, `modelo` varchar(50) DEFAULT NULL, `placa` varchar(10) DEFAULT NULL, `motoristas_id_motorista` int(10) NOT NULL, `regioes_id_regiao` int(10) NOT NULL, `cidades_id_cidade` int(10) NOT NULL, `setores_id_setor` int(10) NOT NULL, PRIMARY KEY (`id_veiculo`), KEY `fk_veiculos_motoristas1_idx` (`motoristas_id_motorista`), KEY `fk_veiculos_regioes1_idx` (`regioes_id_regiao`), KEY `fk_veiculos_cidades1_idx` (`cidades_id_cidade`), KEY `fk_veiculos_setores1_idx` (`setores_id_setor`), ) ENGINE=InnoDB;
A estrutura do banco está correta?
Jose Fernando
Curtidas 2
Melhor post
Claudio Lopes
23/02/2016
Pegar os dados temporariamente.
Entendido. rsrs
Digamos que você precisa fazer alguma coisa (calculo, cruzamentos) e depois utiliza-la em outro cruzamento. Se já usou o SSIS da microsoft ja deve ter percebido, é como quebrar em partes a sua query, facilitando a manutenção.
Também tem a parte de performance....
Imagine que voce tenha uma TABELA_A e que voce precise fazer um join com a TABELA_B, e na mesma query, cruza-la com a TABELA_C.
Se os parametros da sua query for a mesma, não precisa realizar 2 consultas, faça uma e coloque na memória.
GOSTEI 1
Mais Respostas
Claudio Lopes
14/02/2016
Pela estrutura da sua tabela ficaria assim sua query
Observei que você não utilizou campos no formato datetime, Eu utilizaria, pois reduziria a quantidade de colunas de sua tabela e centralizava as informações de periodo, alem de facilitar na manipulação da sua query.
CREATE TEMPORARY TABLE VEICULOS_RESERVADOS SELECT ID_VEICULOS FROM VEICULOS LEFT JOIN RESERVAS ON VEICULOS.ID_VEICULOS = RESERVAS.ID_VEICULOS WHERE @DATA BETWEEN DATAINICIAL AND DATAFINAL AND @HORA BETWEEN HORAINICINAL AND HORAFINAL SELECT * FROM VEICULOS WHERE ID_VEICULOS IN (SELECT ID_VEICULOS FROM VEICULOS_RESERVADOS) DROP TABLE VEICULOS_RESERVADOS
Observei que você não utilizou campos no formato datetime, Eu utilizaria, pois reduziria a quantidade de colunas de sua tabela e centralizava as informações de periodo, alem de facilitar na manipulação da sua query.
GOSTEI 0
Claudio Lopes
14/02/2016
Pela estrutura da sua tabela ficaria assim sua query
Observei que você não utilizou campos no formato datetime, Eu utilizaria, pois reduziria a quantidade de colunas de sua tabela e centralizava as informações de periodo, alem de facilitar na manipulação da sua query.
CREATE TEMPORARY TABLE VEICULOS_RESERVADOS SELECT ID_VEICULOS FROM VEICULOS LEFT JOIN RESERVAS ON VEICULOS.ID_VEICULOS = RESERVAS.ID_VEICULOS WHERE @DATA BETWEEN DATAINICIAL AND DATAFINAL AND @HORA BETWEEN HORAINICINAL AND HORAFINAL SELECT * FROM VEICULOS WHERE ID_VEICULOS IN (SELECT ID_VEICULOS FROM VEICULOS_RESERVADOS) DROP TABLE VEICULOS_RESERVADOS
Observei que você não utilizou campos no formato datetime, Eu utilizaria, pois reduziria a quantidade de colunas de sua tabela e centralizava as informações de periodo, alem de facilitar na manipulação da sua query.
GOSTEI 0
Jose Fernando
14/02/2016
A única a coisa mudar na estrutura da tabela?
Estou quase entendendo o seu código. hehehe
Estou quase entendendo o seu código. hehehe
GOSTEI 0
Claudio Lopes
14/02/2016
Como assim?
GOSTEI 0
Jose Fernando
14/02/2016
O código que me deu, muda apenas algumas partes da estrutura?
GOSTEI 0
Claudio Lopes
14/02/2016
O código que me deu, muda apenas algumas partes da estrutura?
Ainda não consigo entender.. como assim muda as partes da estrutura? formato?
GOSTEI 0
Jose Fernando
14/02/2016
Estrutura do banco.
GOSTEI 0
Alan Mario
14/02/2016
Bem elaborado essa estrutura, Din, essa criação de tabelas temporarias, qual a finalidade?
GOSTEI 0
Jose Fernando
14/02/2016
Pegar os dados temporariamente.
GOSTEI 0
Alan Mario
14/02/2016
Pegar os dados temporariamente.
Entendido. rsrs
GOSTEI 0
Alan Mario
14/02/2016
Obrigado Din, clareou!!!
GOSTEI 0
Jose Fernando
14/02/2016
"Copiado" Din.
GOSTEI 0