Reserva no banco de dados

14/02/2016

3

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