Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

juniorjrml

Tabelas ou Colunas?

Recommended Posts

Galera estou criando um browser game, até agora esta tudo indo bem, mas comecei a reparar que em meu banco de dados tem uma tabela que tem ficado com muitas colunas, e eu em muitas paginas do site tenho que rodar toda a tabela:

 

 

 

while ($strTribod = mysql_fetch_array($strSqld)) {

Eu estava pensando se não seria melhor criar uma tabela para recursos(e ter uma coluna com o nome da tribo ou do próprio jogador que são únicos) , outra para edifícios ,ou seja , dividir a aldeia do jogador em varias tabelas, sendo que eu teria que gerar um código muito maior de consulta em cada pagina.

 

Por enquanto não está dando problema nem nada assim, mais pode começar a dar se tiver muita gente registrada.

 

Qual é a melhor solução para mim?Levando em Conta que o site todo esta em php e mysql?

 

Mais Tabela ou Mais Coluna?

 

Desde já agradeço!!!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como seria mais normalizado? rsrsrs desculpa, é que eu aprendi a mexer sozinho e muita coisa eu não tenho noção :(



To vendo o link :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

pensa nas tabelas como entidades...

Vou tentar dar um exemplo próximo ao seu caso:

você tem a entidade usuário, com dados do usuário, tem a entidade cidade, com dados da cidade (como nome, estado, etc)

tem a entidade prédios, com endereço de cada prédio

tem a entidade apartamento (digamos)

 

Usuário pode ter várias cidades (um para muitos), cidade só pode ser de um usuário, uma cidade pode ter vários prédios, um prédio pode ter vários apartamentos

 

Se você coloca a info de prédios dentro da tabela cidade, então você está limitando a quantidade prédios que uma cidade pode ter.

 

Faz o seguinte, entra em http://entitymanager.net23.net

login: teste@teste.com

senha: 123

 

Clica no projeto cidades e depois em "UML" (ou http://entitymanager.net23.net/visualizaUML.php?projeto=20)

Montei essa estrutura para te mostrar a idéia básica.

(Caso queira ver como fica o sql, clica em BUILD e em "Estrutura SQL")

 

Ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK eu ja tinha terminado de escrever quando vi que tinha respondido eu ja vou deixar o que escrevi aqui em baixo e vou la no site que vc deixou ai em cima :)

 

Sei la eu acho que sou um pouco burro rsrsrs.

o 1FN é fácil de entender o 2 e 3 eu não faço a minima ideia do que estava escrito rsrsrs.

Bem a lógica de dados a ser armazenado eu levo trânquilo, mas eu queria saber em termos técnicos se tem problema uma tabela ter como por exemplo 50 colunas

 

Que com 50 colunas quando executar um while junto com um if eu não vou ter que colocar um segundo while de consulta dentro do primeiro pra chamar a consulta de uma outra tabela. Exemplo:

 

 

 


 

while ($strTribod = mysql_fetch_array($strSqld)) {


     if ($strTribod["id"] == $id) {
        "executa um update dentro de uma tabela só usando a variavel $strTribo['coluna_desejada']";
        "Faz os UPDATES necessarios referente a essa tabela"
                                   }
        }

 

Se não teria que ser algo parecido com isso:

 

 


 


 

//abre a primeira tabela
while ($strTribod = mysql_fetch_array($strSqld)) {

      //quando a pesquisa for verdadeira
     if ($strTribod["id"] == $id) {
        "cria varias variaveis para armazenar os valores dessa tabela"
           //entra com a consulta de outra tabela      
                  while ($strTribot = mysql_fetch_array($strSqld)) {             "armazena as outras informações dessa segunda tabela";
            "só então faz os 'UPDATES' necessários em mais de uma tabela";
                             }


                                   }
        }

 

No exemplo acima eu utilizei como exemplo só duas tabelas, mas se for mais vai cada vez ficando mais extenso e complicado!!!

 

Então, pode ficar em uma tabela mais de 50 colunas sem afetar o desempenho de site? Qual das duas técnicas é mais prejudicial,ou menos...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara... 50 colunas é simplesmente demais... tecnicamente você pode colocar centenas de colunas em uma coluna mas dificilmente isso é aconselhável...

 

porque não cola aqui os campos para eu dar uma olhada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a demora tive que parar para jantar ;)

 

os campos do banco de dados?

 

a coluna que eu usa para conectar todas as tabelas é a que contem o nome da tribo(que tem que ser unico no jogo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando os dados que eu passei anteriormente, acessa:

http://entitymanager.net23.net/visualizaUML.php?projeto=21

 

Não "desenvolvi" coordenada porque não entendi a necessidade... pelo que entendi estaria ali a posição da tribo.. nesse caso eu diria que deveria estar junto da tabela tribo (por ser uma relação 1 para 1)



Pelo site dá para preencher dados, simulando e até mesmo criando uma base para carga inicial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cristianoferr no caso o jogo é multiplayer com aquela tabela de recursos como eu atribuiria uma certa quantidade de recurso a tal tribo?

 

Criando mais uma coluna na tabela recurso?(que armazenaria o nome do jogador ou da tribo?)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu coloquei um campo na entidade recurso_tribo para isso: QTD_RECURSO

 

dessa forma para saber quanto de recurso X a tribo Y tem é só fazer um select:

select qtd_recurso from recurso_tribo where id_recurso=X and id_tribo=Y

 

Entendeu? Fica mais simples e dinâmico... você pode criar uma função que busca essa informação na tabela.

 

Idealmente, e isso já é outra área, quanto menos lógica de banco tiver no código que trata da lógica do jogo melhor.

 

Exemplo: você cria uma classe chamada "gerenciaTribo" e lá contém métodos para atualizar recursos da tribo e pesquisar tais recursos. Idealmente seria criar uma classe Tribo, inicializando com o ID da tribo e só tratando dados dessa tribo via métodos, nunca executando SQL fora dessa classe (e de classes similares, como usuário, recurso, etc).

 

Aí, quando você está programando a lógica do jogo e você quer saber quanto recurso você tem, você faria algo assim:

$qtdRecurso= $tribo->qtdRecurso($id_recurso);

Ou $tribo->possuiRecurso($id_recurso)

 

ou para adicionar: $tribo->adicionaRecurso($id_recurso,$qtdRecurso);

 

Entendeu o que eu quis dizer? Quanto menos você misturar lógica(e scripts) de banco com lógica do jogo, melhor.

Senão você acaba usando SQL em tudo que é lugar, ficando bem difícil dar manutenção.

 

A grande dica é simples: menos é mais.

Quanto menos código você precisa para fazer algo melhor. Quanto menos código duplicado é melhor também.

Se você fica repetindo o mesmo código em repetidos lugares então algo está errado.

 

Beleza?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cristiano, esse site que você passou, os recursos são gerados na hora, programaticamente, ou você apenas subiu as informações e montou os links?

Compartilhar este post


Link para o post
Compartilhar em outros sites

valew cara brigadão se quebrou mó galho :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cristiano, esse site que você passou, os recursos são gerados na hora, programaticamente, ou você apenas subiu as informações e montou os links?

Gerados na hora... eu montei a tabela indicando os campos e caso seja um FK, indicando a entidade. O site é todo dinâmico, você monta uma tabela e pode inserir dados de carga nela.

 

Criei esse site para me ajudar nos meus projetos... a idéia é ter toda a parte de criação de entidades ali e gerar script de create e insert para carga.

 

Cristianoferr no caso o jogo é multiplayer com aquela tabela de recursos como eu atribuiria uma certa quantidade de recurso a tal tribo?

 

Criando mais uma coluna na tabela recurso?(que armazenaria o nome do jogador ou da tribo?)?

Isso foi respondido:

 

 

"Eu coloquei um campo na entidade recurso_tribo para isso: QTD_RECURSO

 

dessa forma para saber quanto de recurso X a tribo Y tem é só fazer um select:

select qtd_recurso from recurso_tribo where id_recurso=X and id_tribo=Y"

 

Você tem que saber o ID do recurso e a ID da Tribo, com isso dá para fazer um select na base.

O ID da tribo é único, não importando quantos usuários existem.

 

A tabela recurso é para todas as tribos, logo não pode ter o id da tribo. Isso se chama relação muitos para muitos, logo para isso criei a recurso_tribo.

Sacou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.