Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
eu estou com a seguinte modelagem...
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.adminweb.com.br/db.png&key=9b6cd9a9923c5c1b92ce41d5f174a8484df093521f0b693557a5ceaf5bdd73a7" alt="db.png" />
na tabela horarios, vai ter registros assim: 7:00,7:30, 8:00,8:30 etc...ae na agenda eu armazeno o horario, o colaborador, o cliente, e o servico, eu gostaria de montar uma tabela onde:
|7:00|colaborador baiana|cliente beltrana|fazer pe|data tal
------------------------------------------------------------------------------
|7:30| | | |
------------------------------------------------------------------------------
|8:00| | | |
------------------------------------------------------------------------------
|8:30|colaborador baiana|cliente cicrana |fazer mao| data y
------------------------------------------------------------------------------
eu nao estou conseguindo a sql q faça isto....eu gostaria de q alguem pudesse me mostrar o caminho...
Cara .. sua modelagem tá feia .. alias, feia não, horrível !
Serviços.valor = varchar ? .. quer dizer então que o preço que é pago por um serviço, você grava como string !?
Produtos.valor = varchar ? .. veja a primeira objeção ..
Complemento = varchar ? um complemento nem sempre é uma referência de local, o cara pode dar uma referencia, e outra e outra e .. existem ruas complicadas, a questão não é o tamanho, mas sim a forma que isto será exibido, portanto deve ser TEXT.
Clientes.datanasc = varchar ? 'data' .. utiliza-se campos DATE
Cidade.varchar ? correto, mas pra que essa ignorância toda de 245 caracteres ? .. não existe cidade, principalmente brasileira que passe dos 50.
Agora, por partes
Um colaborador, vejo que é uma replica de clientes, logo esse 'colaborador', você define ele um usuário com mais importância ou algo associado ao estabelecimento ?
Se for, sua tabela de colaboradores deveria ser removida, e criar uma identificação em clientes, logo um campo 'colaborador' ( true | false ) , tipo boleano
Um serviço está relacionado a um cliente logo o cliente com o serviço contratado ? se sim , então a ligação deve existir, portanto você deve aplicar uma técnica chamada 'junction table' para resolver esse problema.
Aguardo suas respostas em relação as minhas perguntas, daí continuamos.
>
Creio que vai ter de existir uma tabela
cliente_colaborados_horario
sim, por isso existe a tabela agenda
sobre os valores, eu irei formatar antes de ir para o banco vao como R$ preço, e nao so numero...
sobre o campo date, esta ah a primeira modelagem, eu realmente ia mudar pra date...
sobre colaborador, no caso, eh um sistema pra salao de cabelereiros, no caso sei q existe a recepcao q eh um funcionario, mas existem as outras funcionarias, dae eu fiquei sem nome a dar, entao eu chamei de colaborador, como sua sugestao eu realmente irei precisar colocar um campo de q especialidade eh este colaborador, (manicure, depiladora etc)
so nao fiz as ligacoes pq todas as vezes q eu faço uma ligacao, e coloco alguns indices o mysql reclama, como por exemplo ali no colaborador e clientes tem ligacao com estados, no caso, quando eu jogar mais de um registro com o mesmo estado no cliente ou colaborador , o mysql vai chiar...entao la eu terei q desfazer a ligacao dos indices, e colocar so o valor...
Olá, Igor.
Cara, por que você não trata as suas "strings" no próprio PHP? Eu acho mais utilizável e inteligente. Em outras palavras, campos como CPF poderiam virar inteiros e você os trata em PHP. Você deve imaginar o porquê.
E mais, MySQL chiar???????????? Se ele "chia" é porque tem algo errado. ;)
>
sobre os valores, eu irei formatar antes de ir para o banco vao como R$ preço, e nao so numero...
Errado, não devem em caso algum ir com 'R$', não importa se vai usar CONCAT no banco .. para exibir com R$, o MySQL tem seus próprios tipos campos que se encaixam pra valor monetário.
>
esta ah a primeira modelagem
Tipo, sem ofensas .. isso não é modelagem.
>
sobre colaborador, no caso, eh um sistema pra salao de cabelereiros, no caso sei q existe a recepcao q eh um funcionario, mas existem as outras funcionarias, dae eu fiquei sem nome a dar, entao eu chamei de colaborador, como sua sugestao eu realmente irei precisar colocar um campo de q especialidade eh este colaborador, (manicure, depiladora etc)
Faça isso, mas pense no que eu te falei sobre exonerar essa tabela de colaboradores aí, se você colocar a identificação, você vai poder gerenciar da mesma forma, além do mais, evita ficar separando o que é desnecessário, e evita escrever SQL desnecessária.
>
so nao fiz as ligacoes pq todas as vezes q eu faço uma ligacao, e coloco alguns indices o mysql reclama, como por exemplo ali no colaborador e clientes tem ligacao com estados, no caso, quando eu jogar mais de um registro com o mesmo estado no cliente ou colaborador , o mysql vai chiar...entao la eu terei q desfazer a ligacao dos indices, e colocar so o valor...
Exemplifique isso aí, porque eu não sei como o mysql 'chia' por causa de índices, e por favor .. com exemplos executados ou imagens para descrever o problema.
Pra reforçar o que o Andrey disse, pra que duas tabelas idênticas?
Se você quer um tratamento mais semântico que dá no mesmo, faça algo assim:
tipo enum("Cliente", "Colaborador");
Sério, cara. Dá exatamente no mesmo e menos trabalho pro SQL.
Acho que o único maior esforço que você vai ter que fazer é uma função para diferenciar um cliente de colaborador, mas isso, cá entre nós, é babada, né? :P
ok, andrey, ok....
Faça isso, mas pense no que eu te falei sobre exonerar essa tabela de colaboradores aí, se você colocar a identificação, você vai poder gerenciar da mesma forma, além do mais, evita ficar separando o que é desnecessário, e evita escrever SQL desnecessária.
de certa forma você esta certo, mas onde fica a normalizacao? o colaborador vai ter login e senha, o cliente nao..ficarao 2 colunas vazias...ah, eu nao necessito de performance, rodara local...
>
de certa forma você esta certo, mas onde fica a normalizacao? o colaborador vai ter login e senha, o cliente nao..ficarao 2 colunas vazias...ah, eu nao necessito de performance, rodara local...
E daí, performance não porque é externo ou local não, vale pra ambos, que normalização, veja o custo-benefício nesse caso, você vai ter muitos mais campos que poderiam ser unificados em uma única tabela, ao invés de ter 3, sendo um uma identificação, e os outros como 'NULL'
ok, estamos fugindo do assunto do topico, da minha duvida....e ae? como faço?
Mostre qual SQL deu errado, o que você tentou fazer, e o que você quer fazer .. porque eu não entendi nada.
na tabela horarios, vai ter registros assim: 7:00,7:30, 8:00,8:30 etc...ae na agenda eu armazeno o horario, o colaborador, o cliente, e o servico, eu gostaria de montar uma tabela onde:
|7:00|colaborador baiana|cliente beltrana|fazer pe|data tal
------------------------------------------------------------------------------
|7:30| | | |
------------------------------------------------------------------------------
|8:00| | | |
------------------------------------------------------------------------------
|8:30|colaborador baiana|cliente cicrana |fazer mao| data y
------------------------------------------------------------------------------
a sql q eu usei foi
SELECT *
FROM agenda AS a, clientes AS cl, colaboradores AS co, servicos AS s, horarios AS h
WHERE a.clientes_fk = cl.idClientes
AND co.idColaboradores =1
AND a.horarios_fk = h.idHorarios
AND a.servico_fk = s.idServicos
LIMIT 0 , 30
retornou os dados certos, coloquei dados ficticios, mas eu gostaria de montar um datagrid de acordo la emcima...sem ter q recorrer a gambiarras no php (com flex/air)
Certo, então você quer todos os clientes, que tem serviços agendados, e os horários nem sempre são iguais, como 'ClienteA' pode ter um serviço marcado pra 7:30, logo '8:00' não tem ninguém .. é isso ?
sim, q mesmo nao tenha ninguem ali nakele horario, a linha fique vazia, e listando todos os horarios...
>
sim, q mesmo nao tenha ninguem ali nakele horario, a linha fique vazia, e listando todos os horarios...
Certo, aplica-se um LEFT JOIN .. veja
mysql> create schema salao ;
Query OK, 1 row affected (0.00 sec)
mysql> use salao ;
Database changed
mysql> create table clientes (
-> id integer not null auto_increment primary key ,
-> nome varchar ( 28 ) not null
-> ) ;mysql> create table servicos (
-> sid integer not null auto_increment primary key ,
-> servico varchar ( 18 ) not null
-> ) ;
Query OK, 0 rows affected (0.12 sec)
mysql> create table horarios (
-> hid integer not null auto_increment primary key ,
-> horario datetime not null
-> ) ;
Query OK, 0 rows affected (0.07 sec)
mysql> create table servicosHorarios (
-> hid integer not null ,
-> sid integer not null ,
-> id integer not null
-> ) ;
Query OK, 0 rows affected (0.11 sec)
mysql> insert into clientes values ( 1 , 'Luisa' ) ;
Query OK, 1 row affected (0.04 sec)
mysql> insert into servicos values
-> ( 1 , 'Tratamento' ) ,
-> ( 2 , 'Fazer as unhas' ) ;
Query OK, 2 rows affected (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into horarios values
-> ( 1 , '2012-02-20 17:00:00' ) ,
-> ( 2 , '2012-02-20 15:00:00' ) ,
-> ( 3 , '2012-02-20 18:00:00' ) ;
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into servicosHorarios values
-> ( 1 , 1 , 1 ) ,
-> ( 3 , 2 , 1 ) ;
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select h.horario , clientes.nome , servicos.servico
-> from horarios as h
-> left join servicosHorarios as s on h.hid = s.hid
-> left join clientes on clientes.id = s.id
-> left join servicos on s.sid = servicos.sid ;
+---------------------+-------+----------------+
| horario | nome | servico |
+---------------------+-------+----------------+
| 2012-02-20 17:00:00 | Luisa | Tratamento |
| 2012-02-20 15:00:00 | NULL | NULL |
| 2012-02-20 18:00:00 | Luisa | Fazer as unhas |
+---------------------+-------+----------------+
3 rows in set (0.00 sec)
;)
1-, tentei reproduzir e nao consegui,
2- eu preciso saber tb ekm vai atender o cliente, pois a recepcionista eh q recebe o telefonema e registra o atendimento futuro na agenda...
>
1-, tentei reproduzir e nao consegui
Qual foi o problema.
>
2- eu preciso saber tb ekm vai atender o cliente, pois a recepcionista eh q recebe o telefonema e registra o atendimento futuro na agenda...
Certo .. e o que isso te impede de adicionar outro relacionamento ou pensar na possibilidade de fazer uma modelagem bacana !?
ok, qual modelagem você me sugere...?
bom, com mais calma tentei refazer o seu sql, mas nao deu certo...veja...
--
-- Estrutura da tabela agenda
--
CREATE TABLE IF NOT EXISTS `agenda` (
`idAgenda` int(11) NOT NULL AUTO_INCREMENT,
`servico_fk` int(11) DEFAULT NULL,
`colaborador_fk` int(11) DEFAULT NULL,
`clientes_fk` int(11) DEFAULT NULL,
`horarios_fk` int(11) DEFAULT NULL,
`data` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idAgenda`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- Extraindo dados da tabela agenda
--
INSERT INTO agenda (idAgenda, servico_fk, colaborador_fk, clientes_fk, horarios_fk, data) VALUES
(1, 1, 1, 2, 5, NULL),
(2, 2, 1, 2, 2, NULL);
-- --------------------------------------------------------
--
-- Estrutura da tabela clientes
--
CREATE TABLE IF NOT EXISTS `clientes` (
`idClientes` int(11) NOT NULL AUTO_INCREMENT,
`cpf` varchar(15) DEFAULT NULL,
`nome` varchar(245) NOT NULL,
`email` varchar(245) DEFAULT NULL,
`datanasc` varchar(10) DEFAULT NULL,
`rua` varchar(245) DEFAULT NULL,
`numero` varchar(5) DEFAULT NULL,
`complemento` varchar(245) DEFAULT NULL,
`bairro` varchar(245) DEFAULT NULL,
`cidade` varchar(245) DEFAULT NULL,
`Estados_fk` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`idClientes`,`Estados_fk`),
KEY `fk_Clientes_Estados` (`Estados_fk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- Extraindo dados da tabela clientes
--
INSERT INTO clientes (idClientes, cpf, nome, email, datanasc, rua, numero, complemento, bairro, cidade, Estados_fk) VALUES
(1, NULL, 'nina', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0),
(2, NULL, 'baiana', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
-- --------------------------------------------------------
--
-- Estrutura da tabela colaboradores
--
CREATE TABLE IF NOT EXISTS `colaboradores` (
`idColaboradores` int(11) NOT NULL AUTO_INCREMENT,
`cpf` varchar(15) DEFAULT NULL,
`nome` varchar(245) NOT NULL,
`email` varchar(245) DEFAULT NULL,
`datanasc` varchar(10) DEFAULT NULL,
`rua` varchar(245) DEFAULT NULL,
`numero` varchar(5) DEFAULT NULL,
`complemento` varchar(245) DEFAULT NULL,
`bairro` varchar(245) DEFAULT NULL,
`cidade` varchar(245) DEFAULT NULL,
`Estados_fk` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`idColaboradores`,`Estados_fk`),
KEY `fk_Clientes_Estados` (`Estados_fk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- Extraindo dados da tabela colaboradores
--
INSERT INTO `colaboradores` (`idColaboradores`, `cpf`, `nome`, `email`, `datanasc`, `rua`, `numero`, `complemento`, `bairro`, `cidade`, `Estados_fk`) VALUES
(1, NULL, 'marcia', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
-- --------------------------------------------------------
--
-- Estrutura da tabela estados
--
CREATE TABLE IF NOT EXISTS `estados` (
`idEstados` int(11) NOT NULL AUTO_INCREMENT,
`sigla` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idEstados`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Estrutura da tabela horarios
--
CREATE TABLE IF NOT EXISTS `horarios` (
`idHorarios` int(11) NOT NULL AUTO_INCREMENT,
`horario` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idHorarios`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
--
-- Extraindo dados da tabela horarios
--
INSERT INTO horarios (idHorarios, horario) VALUES
(1, '7:00'),
(2, '7:30'),
(3, '8:00'),
(4, '8:30'),
(5, '9:00'),
(6, '9:30');
-- --------------------------------------------------------
--
-- Estrutura da tabela produtos
--
CREATE TABLE IF NOT EXISTS `produtos` (
`idProdutos` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(245) NOT NULL,
`descricao` text,
`valor` varchar(10) NOT NULL,
PRIMARY KEY (`idProdutos`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Estrutura da tabela servicos
--
CREATE TABLE IF NOT EXISTS `servicos` (
`idServicos` int(11) NOT NULL AUTO_INCREMENT,
`servico` varchar(245) NOT NULL,
`descricao` text,
`valor` varchar(45) DEFAULT NULL,
`status` char(1) DEFAULT NULL,
PRIMARY KEY (`idServicos`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- Extraindo dados da tabela servicos
--
INSERT INTO servicos (idServicos, servico, descricao, valor, status) VALUES
(1, 'pe', NULL, NULL, NULL),
(2, 'unha', NULL, NULL, NULL),
(3, 'cabelo', NULL, NULL, NULL);
-----consulta reproduzida e modificada
SELECT h.horario, clientes.nome, servicos.servico
FROM horarios AS h
LEFT JOIN agenda AS s ON h.idHorarios = s.idAgenda
LEFT JOIN clientes ON clientes.idClientes = s.idAgenda
LEFT JOIN servicos ON s.servico_fk = servicos.idServicos
LIMIT 0 , 30
---resultado
horario nome servico
7:00 nina pe
7:30 baiana unha
8:00 NULL NULL
8:30 NULL NULL
9:00 NULL NULL
9:30 NULL NULL
se olhar os dados nas tabelas, vera q tem gente no hrario errado...
Tipo, estou sem cabeça pra pensar agora .. mas depois eu dou uma olhada direitinho pra você e te falo superficialmente .. tenho que estudar a sua ideia e pensar em algo ..
ok, agradeco sua atencao......esta agenda tem q ser vista pela recepcionista, q vai ver os servicos, horarios, clientes, colaboradores, e data, e tb sera visto pelo colaborador...
Andrey, eu procurei refazer a modelagem, como propos, veja se agora esta ok, so faltou uma tabela, q seria a do atendimento (esqueci q tenho q registrar os atendimentos)...
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.adminweb.com.br/gaec.png&key=305042fedbd01a9fedda327c1aadd44304afe73fbc3fb5b4a6307da83d07a232" alt="gaec.png" />
Ainda não sei, melhor ficou .. isso eu te garanto ..
obrigado andrey, consegui com esta ultima modelagem q fiz
select h.horario , clientes.nomeCliente ,funcionario.nomefuncionario, servicos.servico
from horarios as h
left join agenda as a on h.idhorarios = a.horarios_id
left join clientes on clientes.idclientes = a.clientes_id
left join funcionario on funcionario.idfuncionario = a.funcionario_id
left join servicos on funcionario.servicos_id = servicos.idservicos ;
realmente a modelagem fui infeliz namodelagem, engraçado q com sistemas mais complexos eu consigo fazer uma boa modelagem, la com sistemas simples...mas muito obrigado pela atenção...
como eu nunca precisei de joins..eu nunca soube como utiliza-los...
Creio que vai ter de existir uma tabela
cliente_colaborados_horario