Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe alguma vantagem/desvantagem de armazenar o valor do campo como uma matriz JSON em vez de criar uma nova tabela e apostar em um relacionamento um para muitos?


Na minha experiência, isso depende muito dos dados armazenados. Ambas as formas têm vantagens e desvantagens. Se for um MMORPG webgame então diga que você tem um PC que tem cinto. E o PC pode colocar poções nesse cinto para um acesso rápido durante uma batalha. Então queremos salvar os ids das poções, que ficam guardados no cinto do personagem.

O pedido mais comum seria "pegue todas as poções que o personagem X tem". E isso seria muito rápido em ambos os casos.

Os benefícios de armazenar esses IDs de poção como uma tabela separada:
  • Você pode procurar por um id de poção específico e é muito rápido. Exemplo no jogo:os administradores removeram algumas poções do jogo e, portanto, você precisa atualizar os cintos de todos
  • Você pode obter algumas estatísticas interessantes. Exemplo no jogo:procure a poção mais usada entre todos os jogadores
  • O banco de dados manterá a integridade dos dados. Exemplo no jogo:você nunca encontrará uma situação quando usou a poção e o jogo diz "Opa, uma poção com esse id não existe"
  • É bom para a consistência. Exemplo do jogo:você tirou uma poção do cinto e colocou na mochila. O jogo pode implementá-lo chamando uma transação com duas instruções SQL simples e claras.
  • Você pode fazer JOINs. Exemplo no jogo:precisamos obter uma lista de poções no cinto junto com seus nomes, pesos e imagens que são armazenadas em uma tabela separada.
  • Você pode atualizar um único item, sem precisar atualizar o cinto inteiro. Exemplo forçado no jogo:você tem um milhão de poções no cinto e bebeu uma.

Os benefícios de armazenar como um json:
  • Se for um jogo de navegador que usa javascript no lado do cliente, você obtém o objeto Belt json com uma solicitação simples em vez de fazer uma consulta Select e depois converter para json
  • É muito mais fácil manter a ordem dos itens, já que os arrays json já estão ordenados. Com a abordagem de tabela, você precisaria de uma coluna adicional chamada "pedido" e atualizá-la sempre e verificar se dois itens não têm o mesmo pedido etc.
  • Você pode fazer vários rearranjos no Cinto no lado do cliente e clicar em "Aplicar" — boom, com uma consulta você pode atualizar todo o cinto. Considerando que com a abordagem de tabela você precisaria de pelo menos duas consultas para isso (DELETE + INSERT)
  • além disso, os DBMS populares têm plugins que suportam funções json no banco de dados

Conclusão:esses não são principais vantagens e não críticas problemas. Todos eles são solucionáveis ​​e com um design adequado do aplicativo, ambas as soluções funcionarão bem. Antes de decidir como armazenar os dados, pergunte-se quais são os casos de uso mais comuns para esses dados e escolha a solução posteriormente.