Reserva no banco de dados

14/02/2016

0

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:


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

Jose Fernando

Responder

Post mais votado

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.

Claudio Lopes

Claudio Lopes
Responder

Mais Posts

15/02/2016

Claudio Lopes

Pela estrutura da sua tabela ficaria assim 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.
Responder

15/02/2016

Claudio Lopes

Pela estrutura da sua tabela ficaria assim 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.
Responder

16/02/2016

Jose Fernando

A única a coisa mudar na estrutura da tabela?

Estou quase entendendo o seu código. hehehe
Responder

16/02/2016

Claudio Lopes

Como assim?
Responder

17/02/2016

Jose Fernando

O código que me deu, muda apenas algumas partes da estrutura?
Responder

17/02/2016

Claudio Lopes

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?
Responder

19/02/2016

Jose Fernando

Estrutura do banco.
Responder

20/02/2016

Alan Mario

Bem elaborado essa estrutura, Din, essa criação de tabelas temporarias, qual a finalidade?
Responder

21/02/2016

Jose Fernando

Pegar os dados temporariamente.
Responder

22/02/2016

Alan Mario

Pegar os dados temporariamente.


Entendido. rsrs
Responder

27/02/2016

Alan Mario

Obrigado Din, clareou!!!
Responder

27/02/2016

Jose Fernando

"Copiado" Din.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar