Jump to content


Photo

Tabela Do Banco Dados Muito Grande


  • Faça o login para participar
13 replies to this topic

#1 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 18:16

olha só, estou fazendo um site de sorteio de premios.
tenhu uma tabela 'promo', uma 'usuarios' e outra 'participantes'.

Daí quando o usuário desejar participar duma certa promoção, ele clica na promoção e vai pra tabela "participantes": o id da promoção (id_promo) e o id do usuário que clicou em participar (id_users).

Para ver em quantas promoções o usuário participou até o momento, eu faço uma busca nessa tabela 'participantes', pesquisando se tem o id do usuário no campo id_users e pedir pra contar quantas vezes e mostro o numero, correto?
Tb dá pra fazer uma busca somente nas promoções que ainda estão para ser sorteadas e mostrar para o usuários as que ainda estão para ser sorteadas...

Agora imagine que em uma única promoção, 10000 usuários se inscrevam. Daí eu não posso apagar as promoções que já foram sorteadas, porque como eu vou saber quantas promoções o usuário participou se eu não tenho no BD?
Não ficaria muuuuuuuito grande ter milhares de registros na tabela 'participantes', mesmo sendo apenas 3 campos?


Se sim, como eu poderia resolver isso?



Otavio Boari

#2 brunoalves

brunoalves

    Linux user #392843

  • Ex-Admins
  • 1018 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 03/03/2005, 18:51

Você poderia ao término da promoção, mover os dados para uma tabela de bkp, e ter opções separadas para consultar promoções atuais e encerradas.

Se bem que, dependendo da forma que montar o modelo do banco de dados e qual BD estiver usando, esse volume de registros não é nada.

Abraço.

#3 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 19:06

Esse banco de dados por enquanto tem 9 tabelas, e acho que não terá mais...
Tenho dúvidas em que tipo de campo usar em cada caso... costumo usar mais o VARCHAR.

Olha só, eu poderia colocar a estrutura do meu banco de dados aqui e vc dava uma olhada onde poderia melhorar?


Otavio Boari

#4 brunoalves

brunoalves

    Linux user #392843

  • Ex-Admins
  • 1018 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 03/03/2005, 19:21

Podemos dar uma olhada, não só eu :D, seria uma boa idéia.

Só use o varchar para campos de texto que tenham comprimento variável (nome, cidade etc...), para os demais use campos mais específicos, isso ajudará o engine do BD, fazendo com que as operações sejam mais rápidas.

Abraço.

#5 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 19:49

CREATE DATABASE premios;

USE premios;

CREATE TABLE `usuarios` (
  `id_users` INT NOT NULL AUTO_INCREMENT, 
  `email` varchar(50) default NULL,
  `senha` varchar(8) default NULL,
  `nome` varchar(50) default NULL,
  `apelido` varchar(20) default NULL,
  `cpf` varchar(20) default NULL,
  `end` varchar(50) default NULL,
  `num` varchar(10) default NULL,
  `bairro` varchar(25) default NULL,
  `complemento` varchar(35) default NULL,
  `cep` varchar(10) default NULL,
  `cidade` varchar(50) default NULL,
  `estado` varchar(20) default NULL,
  `dia` varchar(2) default NULL,
  `mes` varchar(2) default NULL,
  `ano` varchar(4) default NULL,
  `sexo` varchar(10) default NULL,
  `telddd` varchar(6) default NULL,
  `celddd` varchar(6) default NULL,
  `tel` varchar(14) default NULL,
  `cel` varchar(14) default NULL,
  `estadocivil` varchar(10) default NULL,
  `escolaridade` varchar(20) default NULL,
  `profissao` varchar(35) default NULL,
  `receber` varchar(10) default NULL,
  `como` varchar(15) default NULL,
  `ip` varchar(20) default NULL,
  `data` varchar(20) default NULL,
PRIMARY KEY ( `id_users` ) 
) TYPE=MyISAM;



CREATE TABLE `promo` (
  `id_promo` INT NOT NULL AUTO_INCREMENT, 
  `nome` varchar(50) default NULL,
  `resumo` varchar(150) default NULL,
  `descricao` text,
  `infos` text,
  `dia` varchar(5) default NULL,
  `mes` varchar(5) default NULL,
  `ano` varchar(5) default NULL,
  `fotodestaque` text,
  `foto1` text,
  `foto2` text,
  `foto3` text,
  `vencedor` varchar(10) default NULL,
PRIMARY KEY ( `id_promo` ) 
) TYPE=MyISAM;



CREATE TABLE `participantes` (
  `id_part` INT NOT NULL AUTO_INCREMENT, 
  `id_users` varchar(8) default NULL,
  `id_promo` varchar(8) default NULL,
PRIMARY KEY ( `id_part` ) 
) TYPE=MyISAM;


CREATE TABLE `admin` (
  `id_admin` INT NOT NULL AUTO_INCREMENT, 
  `nome` varchar(50) default NULL,
  `email` varchar(50) default NULL,
  `login` varchar(8) default NULL,
  `senha` varchar(8) default NULL,
  `nivel` varchar(3) default NULL,
PRIMARY KEY ( `id_admin` ) 
) TYPE=MyISAM;


CREATE TABLE `banners` (
  `id_banners` INT NOT NULL AUTO_INCREMENT, 
  `empresa` varchar(50) default NULL,
  `banner` text,
  `tipo` varchar(2) default NULL,
  `alt` varchar(100) default NULL,
  `link` varchar(100) default NULL,
PRIMARY KEY ( `id_banners` ) 
) TYPE=MyISAM;


CREATE TABLE `useronline` (
  `timestamp` int(15) NOT NULL default '0',
  `ip` varchar(40) NOT NULL default '',
  `arquivo` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`timestamp`),
  KEY `ip` (`ip`)
) TYPE=MyISAM;

CREATE TABLE `parceiros` (
  `id_pco` varchar(10) default NULL, 
  `empresa` varchar(50) default NULL,
  `email` varchar(50) default NULL,
  `login` varchar(8) default NULL,
  `senha` varchar(8) default NULL,
  `nivel` varchar(3) default NULL,
PRIMARY KEY ( `id_pco` ) 
) TYPE=MyISAM;


CREATE TABLE `produtos` (
  `id_produto` varchar(15) default NULL, 
  `nome` varchar(20) default NULL,
  `descricao` varchar(50) default NULL,
  `link` varchar(50) default NULL,
  `foto` text,
  `pco` varchar(40) default NULL,
PRIMARY KEY ( `id_produto` ) 
) TYPE=MyISAM;


CREATE TABLE `obs` (
  `id_obs` INT NOT NULL AUTO_INCREMENT, 
  `obs` text,
  `pco` varchar(40) default NULL,
PRIMARY KEY ( `id_obs` ) 
) TYPE=MyISAM;


Talvez eu tenha que fazer algumas alterações aqui ainda. talvez adicione uma enquete no site daí muda um pouco...

Veja só, na tabela 'participantes', talvez seria interessante colocar um campo chamado datains que seria a data que o usuário se inscreveu na promoção, para que eu pudesse mostrar para o usuário, 'Voce já está cadastrado nessa promoção. Seu cadastro foi realizado no dia x ás x horas'.

Note que a data eu coloquei o dia mes e ano pra que ficasse fácil a manipulação pois o sistema vai enviar um e-mail para as pessoas que fazem aniversário no dia, backup automático, lembretes de mes em mes e tals....

o ddd do cel e do tel tb coloquei separados pq dependendo da operadora vou tentar enviar mensagens dinamicamente...

De uma olhada aí e veja o que eu poderia alterar para facilitar a navegação...


Valew

t+


Otavio Boari

#6 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 03/03/2005, 19:55

Primeiro...
CREATE TABLE `participantes` (
 `id_users` INT NOT NULL,
 `id_promo` INT NOT NULL,
PRIMARY KEY ( `id_users`,`id_promo` )
) TYPE=MyISAM;

Isto evita que um mesmo usuário se escreva várias vezes em uma promoção, além de deixar o uso do sistema mais leve.

Algumas observações:
- Alguns campos como, estado civil, escolaridade, sexo, receber poderiam ser substituidos por campos CHAR(1).
- Campos como dia, mes, ano, poderia ser substituidos por um unico campo DATA, NIVER, CADASTRADOEM para o tipo DATE ou DATETIME, assim como os demais campos de data e hora.

Pergunta:
Qual o real objetivo desses campos da tabela promo?
`fotodestaque` text, `foto1` text, `foto2` text, `foto3` text,
------
Mero mortal!

#7 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 20:16

OK prog,

sobre a primeira observação, poderia me explicar o porque CHAR(1)? só pra saber mesmo, aprender...

Nos campos dia mes ano que seriam substituídos depois eu poderia pegar um a um por explode(), certo? ;)

`fotodestaque` text, `foto1` text, `foto2` text, `foto3` text,

Estes campos são das fotos, o fotodestaque é obrigatório para que apareça uma miniatura da promoção na página inicial, onde vão ter 20 premios listados...os outros são campos de imagens q não vão ser obrigatórios e vou chamar com a condição if para que se tiver no banco de dados mostra e se não tiver não precisa...Não vão ser todos os parceiros que vamos usar as 3 fotos...


Mas já valeu pelas dicas hein pessoal (y)


Otavio Boari

#8 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 03/03/2005, 20:34

Quanto ao CHAR(1) neste caso, ele seria como o VARCHAR, só que o VARCHAR exige mais do sistema, nesta caso em especifico, para os campos citados.

Exemplo:

estadocivil CHAR(1)
(S/C/D/...)
Solteiro, Casado, Disquitado, ...

escolaridade CHAR(2)
(SC/SI/GC/GI/PC/PI/PG/...)
Superior Completo, Superior Incompleto, Segundo Grau Completo, Segundo Grau Incompleto, Primeiro Grau Completo, Primeiro Grau Incompleto, Pos-Graduado, ...

estado CHAR(2)
(RN/RJ/SP/TO/MG/MS/RS/PR/...)
Esses vc sabe...

sexo CHAR(1)
(M/F)
Masculino, Feminino


Este tipo de informação pode ser definida por apenas 1 ou 2 caracteres.

Questão:
Vc esta salvando as imagens no banco de dados?
------
Mero mortal!

#9 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 20:52

Salvando somente o nome do arquivo de imagem no bd...daí chamo na page...

O sistema tá indo bem cara, mas pelo jeito vou ter que trocar algumas coisas né?
Vai dar pra economizar muita coisa com essas dicas...

O problema é que um site de sorteios em média, recebe 6 mil visitas por dia de sorteio e tem milhares de inscritos todos os meses...daí esses usuários podem se cadastrar em todas as promoções do site, que vão ser um pouco menos de 1 por dia. Isso que eu tenho medo de enfiar milhares de dados na tabela e ficar grande d+, já que vou acessa-la para mostrar algumas estatísticas.

Ando testando num servidor aqui, se quiser dá uma olhada.
ADMINISTRAÇÃO
login - as
senha - as

tem uma área só para os parceiros colocarem seus produtos
PARCEIROS
daí o login e senha ve lá no painel de admin.

Tem um sistema de banners tb e um calendário dinamico que é preenchido sempre que se adiciona uma promoção lá pelo admin
Calendario


e-mails para todos os usuários, para um somente, observações para os parceiros, e um monte de coisinha q eu vou adicionando diariamente...

Se puder, de uma olhada...

Otavio Boari

#10 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 03/03/2005, 21:00

Se os campos responsáveis por gravar somente as informações de localização da foto, colocaria no formato de VARCHAR ao invez de TEXT.

Sobre o banco ficar grande, cara, isto vai depender muito, se vc esta dizendo que o site tem pouco mais de 1 promoção por dia e este tem mais de 10000 usuários e recebe mais de 6 mil vizitas por dia, claro que o banco vai ficar grande, mas isto é uma responsabilidade do host em manter o site em pleno funcionamento, se for o caso, contrate um serviço maior, ou um serviço de host particular, onde a maquina vai ser exclusiva para o funcionamento do banco de dados.

Vai depender do fluxo real.
------
Mero mortal!

#11 brunoalves

brunoalves

    Linux user #392843

  • Ex-Admins
  • 1018 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 03/03/2005, 21:01

Achei que ia postar o DER, assim fica meio enrolado de analisar ;)

Concordo com o Prog.

Outra coisa que faria era normalisar os campos, por exemplo, porque em uma tabela o IP é um varchar (20) e em outra é um varchar(40), quando poderia ser em todas um char(15)?

No caso das fotos, crie mais uma tabela, com o ID da promoção, o caminho da foto e um flag para dizer se é destaque, crie um indice único com o ID da promoção mais o flag, assim não seria permitido mais de um destaque pro promoção.

Fazendo o que falei acima, vai evitar campos nulos na tabela promoções (isso deve ser evitado em todas as tabelas, estude as demais para ver se isso não ocorre).

Para os IDs, use INT em campos autunuméricos, a não ser que seja impossível, lembre-se que compara um número, será sempre mais rápido que um texto.

Se tiver o DER, poste um link para ele aqui, que fica mais fácil analisar.

Abraço.

#12 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 03/03/2005, 21:28

Boas dicas
vou usar todas, mas vou ter que reestruturar muita coisa...

Tem a parte de login tb que tenhu algumas dúvidas e mais pra frente vou abrir um tópico pra poder resolve-las. Não quero dar brecha pra erros porque pode dar problemas até judiciais por exemplo dá uma pane e sai sorteando o premio pra todo mundo, eu estaria f... :P

Daí tenho estudado muito o cron pra ver se realmente vale a pena...

brunoalves, desculpe a minha ignorancia mas o que é DER? :o

não sei mesmo o que é, pelo menos não reconhecí a sigla...

Vlws
Otavio Boari

#13 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 03/03/2005, 21:57

DER = Diagrama de Entidade de Relacionamento.

Seria mais ou menos um "desenho" do seu banco de dados, e neste desenho aparecem os tipos de campos e como uma tabela se relaciona com outra.
------
Mero mortal!

#14 boari

boari

    24 Horas

  • Usuários
  • 411 posts
  • Sexo:Masculino
  • Localidade:São joão Del Rei - Minas Gerais
  • Interesses:PHP, MySQL, SQL Server

Posted 05/03/2005, 16:21

Quanto ao CHAR(1) neste caso, ele seria como o VARCHAR, só que o VARCHAR exige mais do sistema, nesta caso em especifico, para os campos citados.

Exemplo:


estadocivil CHAR(1)
(S/C/D/...)
Solteiro, Casado, Disquitado, ...

escolaridade CHAR(2)
(SC/SI/GC/GI/PC/PI/PG/...)
Superior Completo, Superior Incompleto, Segundo Grau Completo, Segundo Grau Incompleto, Primeiro Grau Completo, Primeiro Grau Incompleto, Pos-Graduado, ...

estado CHAR(2)
(RN/RJ/SP/TO/MG/MS/RS/PR/...)
Esses vc sabe...

sexo CHAR(1)
(M/F)
Masculino, Feminino


Este tipo de informação pode ser definida por apenas 1 ou 2 caracteres.

ok, fiz isso mas como eu faço pra mostrar de acordo com o nome real?

pois agora tenho no banco o 1 grau completo assim, 1C

daí eu teria que fazer um monte de condições? tipo, se for 1C exibe 1 grau completo

Imagina na hora das profissoes o monte de condições q eu teria q impor... :wacko:

Tem alguma forma mais fácil pra fazer isso?

Outra coisa, onde eu posso ler mais sobre como fazer o DER?



valews
Otavio Boari




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq