• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

18 mensagens neste tópico

Ois

Por exemplo uma loja de informatica para colocar os seus produtos numa base de dados eh melhor :

1 : Criar uma base de dados por exemplo chamada "BDProdutos" e uma tabela chamada "Produtos" e

colocar todos os produtos dentro dessa tabela.

ou

2 : Criar uma base de dados por exemplo chamada "BDProdutos" e uma tabela para cada tipo de produto,

por exemplo uma tabela chamada "Processadores", outra "MotherBoards", etc

Agradeço toda a ajuda que poderem dar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

apenas uma tabela para os produtos e terias um atributo a indicar o tipo. depois poderias ter outra tabela com os tipos de produtos (sendo que o tipo de produto seria uma chave estrangeira para esta tabela).

repara que se usasses a 2ª opção terias de saber à partida todos os tipos de produtos e criar todas esas tabelas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ois

Obrigado pela resposta.

E se depois fosse pedido para ordenar os produtos por marca, ou por nome , etc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

qual é o problema?

select *
  from Produtos
  order by Marca

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela ajuda.

Uma cena que eu tb nao percebo muito bem eh a "Collation", qual a melhor ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

penso que isso tem a ver com a codificação dos caracteres. cheguei a usar isso no MySQL, mas agora ando mais pelo MSSQLServer e não me preocupo com isso e funciona tudo direito.

não sei que SGBD estás a usar, mas provavelmente também não precisas de te preocupar com isso, deixar estar o valor default.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

apenas uma tabela para os produtos e terias um atributo a indicar o tipo. depois poderias ter outra tabela com os tipos de produtos (sendo que o tipo de produto seria uma chave estrangeira para esta tabela).

repara que se usasses a 2ª opção terias de saber à partida todos os tipos de produtos e criar todas esas tabelas.

Nao percebi muito bem a cena da "chave estrangeira".

Eh isto : ter numa tabela por exemplo um campo com "Processadores" e outro campo com "1".

depois na tabela dos produtos estao os processadores com os campos e um desses campos eh um index com o numero "1".

E desculpa la estar a ser tao chato.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Por exemplo uma loja de informatica para colocar os seus produtos numa base de dados eh melhor :

Fazeres a modelação correcta do sistema, fazer bases de dados a martelo acaba sempre por dar asneira :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

apenas uma tabela para os produtos e terias um atributo a indicar o tipo. depois poderias ter outra tabela com os tipos de produtos (sendo que o tipo de produto seria uma chave estrangeira para esta tabela).

repara que se usasses a 2ª opção terias de saber à partida todos os tipos de produtos e criar todas esas tabelas.

Nao percebi muito bem a cena da "chave estrangeira".

Eh isto : ter numa tabela por exemplo um campo com "Processadores" e outro campo com "1".

depois na tabela dos produtos estao os processadores com os campos e um desses campos eh um index com o numero "1".

E desculpa la estar a ser tao chato.

É isso mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ois

Tenho uma base de dados chamada "Produtos", e uma tabela chamada "TProdutos", a tabela tem 3 campos,

"Nome", "Marca", "Tipo". Este ultimo eh um index, quando faço uma procura na tabela dando o campo "Tipo"

o MySQL nao corre as Rows todas da tabela para ver se essa Row tem aquele tipo porque o campo "Tipo"

eh um index, nao eh isso ?

<?php
$Conectar=mysql_connect(DB_Host, DB_User, DB_Pass) Or Die("Falhou conectar á base de dados");
mysql_select_db("Produtos", $Conectar) Or Die("Base de dados desconhecida");

$result = mysql_query("SELECT * FROM TProdutos WHERE Tipo='2' ORDER BY Nome");
$Num=mysql_num_rows($result);

for ($aa=0;$aa<$Num;$aa++)
{
$Row = mysql_fetch_row($result);
echo "<pre>";
print_r($Row);
echo "</pre>";
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ã?

Se tens uma coluna chamada tipo é claro que o MySql procura nela...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Volto a afirmar que estás a fazer a base de dados a martelo! A forma com tens as tabelas é a solução "a pedreiro", desculpem a expressão.

Quantas entidades queres representar e que relações tens entre as entidades?

Já agora se o campo Tipo é VARCHAR porque é que usas números? Ou o campo não é VARCHAR? É que se não for então tens de retirar as plicas em torno do 2.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora se o campo Tipo é VARCHAR porque é que usas números? Ou o campo não é VARCHAR? É que se não for então tens de retirar as plicas em torno do 2.

eu no SQLServer meto plicas em tudo e não dá problemas (isto para não ter que andar a decorar quando é que preciso de plicas ou não). no MySQL também estava na ideia que se podia meter plicas em tudo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que faças isso no MSSQL Server não significa que esteja correcto ;), nem quero dizer que não funcione, apenas que as plicas têm um objectivo que não é estar em torno de todos os tipos de dados ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Volto a afirmar que estás a fazer a base de dados a martelo! A forma com tens as tabelas é a solução "a pedreiro", desculpem a expressão.

Quantas entidades queres representar e que relações tens entre as entidades?

Já agora se o campo Tipo é VARCHAR porque é que usas números? Ou o campo não é VARCHAR? É que se não for então tens de retirar as plicas em torno do 2.

Eu na realidade nao tou a fazer base de dados nenhuma, so tou a testar para ver como funciona, curiosidade. Falaram me no index e quis

ver o que fazia.

O campo "Tipo" eh "Int", nao sabia que nao podia por plicas, para a proxima ja sei.

Como farias ? Ponhas todos os produtos dentro da mesma tabela ou em varias tabelas ?

ã?

Se tens uma coluna chamada tipo é claro que o MySql procura nela...

Eu sei que procura nela, mas se tiveres mil produtos e so 10 tiverem o "Tipo" "2" vai ver nesses mil produtos o "Tipo" ou

como o "Tipo" eh um index ja tem esses 10 produtos indexados e so vai mesmo buscar esses 10 produtos ?

Agradeço a ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vai ver esses 1000 produtos, embora o indice ajude não faz maravilhas ;)

Claro que depende de implementação do motor da base de dados mas colocar indices não significa restringir da forma como estás a pensar.

Como faria? Como te disse, analizava o sistema ;). Neste caso apenas falas em duas entidades, uma Produto e um TipoProduto. Repara que entidades não é o mesmo que tabelas. Essas duas entidades estão relacionadas, pelo que disseste, através de um relacionamento binário de cardinalidade 1 na entidade TipoProduto e N na entidade Produto. Participação obrigatória do lado N. Isto resulta em duas tabelas, uma cada entidade, em que a chave primária da tabela TipoProduto é chave estrangeira da tabela Produto. E voilá, uma base de dados simples e acima de tudo normalizada!

A partir daqui tens a certeza que na tua base de dados não há valores a null nas tabelas, não há fragmentação da informação, não há inconsistência de informação e tudo funciona bem. É claro que nada é perfeito ;) e esta base de dados podia ser optimizada, mas também isso tem regras, não é só colocar uma campo na tabela X ou retirar um da tabela Y. Criar um base de dados deve ser feito seguindo as regras para o efeito, sejam Diagramas Entidade Relacionamento, sejam as Formas Normais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ois

Obrigado pela resposta.

Tive a pesquisar sobre o index e encontrei isto :

"7.4.5. How MySQL Uses Indexes

Indexes are used to find rows with specific column values quickly. Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows. The larger the table, the more this costs. If the table has an index for the columns in question, MySQL can quickly determine the position to seek to in the middle of the data file without having to look at all the data. If a table has 1,000 rows, this is at least 100 times faster than reading sequentially. If you need to access most of the rows, it is faster to read sequentially, because this minimizes disk seeks. "

Pelo que diz ai acho que nao vai ver os mil produtos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não os vai ver, realmente na maioria das implementação nunca se vêem a linhas todas das tabelas, mas nunca nos devemos fiar no que supostamente está implementado. Mas como também diz, se precisas de aceder frequentemente a todas as linhas é mais rápido não usar indices. Depende do que queres fazer.

A questão dos indices é complicada, essa e a de todos os pontos onde entre a optimização. No momento em que estás a pensar o sistema pode ser dificil saber que campos são usados mais frequentemente nas pesquisas. Só depois de teres a base de dados implementada e de fazeres testes é que consegues garantir que um campo precisa de um indice. É claro que com a prática vais adquirindo a capacidade de prever melhor como se comporta o sistema e saber se um campo precisa ou não de um indice.

Uma base de dados deve ser sempre normalizada, mas um base de dados normalizada não é uma base de dados optimizada para performance, podemos dizer que é optimizada para segurança dos dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora