Eu tenho duas tabelas no MySQL. Tabela Pessoa tem as seguintes colunas:
id | name | fruits
A fruits
coluna pode conter nulos ou uma matriz de strings como ('maçã', 'laranja', 'banana') ou ('morango'), etc. A segunda tabela é Fruta de mesa e tem as seguintes três colunas:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Então, como devo projetar a fruits
coluna na primeira tabela para que ela possa conter uma matriz de strings que obtêm valores da fruit_name
coluna na segunda tabela? Já que não há tipo de dados de matriz no MySQL, como devo fazer isso?
mysql
database-schema
tonga
fonte
fonte
Respostas:
A maneira correta de fazer isso é usar várias tabelas e
JOIN
elas em suas consultas.Por exemplo:
A
person_fruit
tabela contém uma linha para cada fruto uma pessoa está associado e efetivamente liga operson
efruits
mesas juntos, IEQuando você deseja recuperar uma pessoa e todas as suas frutas, você pode fazer algo assim:
fonte
person_id
mas diferentefruit_name
. Esta é efetivamente uma implementação da teoria da resposta de Janus.person
mesa, qualquer informação sobre a fruta nafruits
mesa e qualquer informação especificamente sobre a relação entre uma pessoa em particular e uma fruta em particular naperson_fruit
mesa. Como neste exemplo não há nenhuma informação adicional, aperson_fruit
tabela tem apenas duas colunas, as chaves primárias das tabelasperson
efruits
. A quantidade de uma fruta específica é um exemplo de outra coisa que poderia entrar naperson_fruit
tabela.INT
de uma chave emfruits
e só tem esseINT
emperson_fruit
? Portanto, o nome pode ser alterado posteriormente e também precisaria de menos espaço se você não tivesse muito mais linhas dentro dofruits
que emperson_fruit
.O motivo de não haver matrizes no SQL é porque a maioria das pessoas realmente não precisa deles. Os bancos de dados relacionais (SQL é exatamente isso) funcionam usando relações e, na maioria das vezes, é melhor atribuir uma linha de uma tabela para cada "bit de informação". Por exemplo, onde você pode pensar "Eu gostaria de uma lista de coisas aqui", em vez disso, faça uma nova tabela, ligando a linha de uma tabela com a linha de outra. [1] Dessa forma, você pode representar relacionamentos M: N. Outra vantagem é que esses links não atrapalharão a linha que contém o item vinculado. E o banco de dados pode indexar essas linhas. Normalmente, as matrizes não são indexadas.
Se você não precisa de bancos de dados relacionais, pode usar, por exemplo, um armazenamento de valor-chave.
Leia sobre normalização de banco de dados , por favor. A regra de ouro é "[Todo] não-chave [atributo] deve fornecer um fato sobre a chave, a chave inteira e nada além da chave.". Uma matriz faz muito. Possui múltiplos fatos e armazena o pedido (que não está relacionado à própria relação). E o desempenho é ruim (veja acima).
Imagine que você tem uma mesa pessoal e uma mesa com ligações de pessoas. Agora você pode fazer com que cada linha de pessoa tenha uma lista de suas ligações. Mas cada pessoa tem muitos outros relacionamentos com muitas outras coisas. Isso significa que minha tabela pessoal deve conter um array para cada coisa a que ele está conectado? Não, isso não é um atributo da própria pessoa.
[1]: Tudo bem se a tabela de ligação tiver apenas duas colunas (as chaves primárias de cada tabela)! No entanto, se o próprio relacionamento tiver atributos adicionais, eles devem ser representados nesta tabela como colunas.
fonte
O MySQL 5.7 agora fornece um tipo de dados JSON . Este novo tipo de dados fornece uma nova maneira conveniente de armazenar dados complexos: listas, dicionários, etc.
Dito isso, os rrays não mapeiam bem os bancos de dados, por isso os mapas relacionais de objetos podem ser bastante complexos. Historicamente, as pessoas armazenam listas / arrays no MySQL criando uma tabela que os descreve e adicionando cada valor como seu próprio registro. A tabela pode ter apenas 2 ou 3 colunas, ou pode conter muito mais. O modo como você armazena esse tipo de dados realmente depende das características dos dados.
Por exemplo, a lista contém um número estático ou dinâmico de entradas? A lista permanecerá pequena ou deverá crescer para milhões de registros? Haverá muitas leituras nesta mesa? Muitas gravações? Muitas atualizações? Todos esses são fatores que precisam ser considerados ao decidir como armazenar coleções de dados.
Além disso, os armazenamentos de dados / documentos Key: Value, como Cassandra, MongoDB, Redis etc., também fornecem uma boa solução. Esteja ciente de onde os dados estão realmente sendo armazenados (se estão armazenados no disco ou na memória). Nem todos os seus dados precisam estar no mesmo banco de dados. Alguns dados não mapeiam bem para um banco de dados relacional e você pode ter motivos para armazená-los em outro lugar, ou você pode querer usar uma chave na memória: banco de dados de valor como um cache quente para dados armazenados em disco em algum lugar ou como um armazenamento efêmero para coisas como sessões.
fonte
Uma nota a ser considerada, você pode armazenar matrizes no Postgres.
fonte
No MySQL, use o tipo JSON.
Ao contrário das respostas acima, o padrão SQL incluiu tipos de array por quase vinte anos; eles são úteis, mesmo que o MySQL não os tenha implementado.
No seu exemplo, entretanto, você provavelmente desejará criar três tabelas: pessoa e fruta, depois pessoa_fruta para juntá-las.
Se você deseja associar a pessoa a uma variedade de frutas, pode fazer isso com uma visualização:
A visualização mostra os seguintes dados:
No 5.7.22, você desejará usar JSON_ARRAYAGG , em vez de hackear o array a partir de uma string.
fonte
Use o tipo de campo de banco de dados BLOB para armazenar matrizes.
Ref: http://us.php.net/manual/en/function.serialize.php
fonte
você pode armazenar seu array usando group_Concat assim
AQUI um exemplo em violino
fonte