Tengo dos tablas en MySQL. Table Person tiene las siguientes columnas:
id | name | fruits
La fruits
columna puede contener un valor nulo o una matriz de cadenas como ('manzana', 'naranja', 'plátano') o ('fresa'), etc. La segunda tabla es Table Fruit y tiene las siguientes tres columnas:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Entonces, ¿cómo debo diseñar la fruits
columna en la primera tabla para que pueda contener una matriz de cadenas que toman valores de la fruit_name
columna en la segunda tabla? Dado que no hay un tipo de datos de matriz en MySQL, ¿cómo debo hacerlo?
mysql
database-schema
tonga
fuente
fuente
Respuestas:
La forma correcta de hacer esto es utilizar varias tablas y
JOIN
ellas en sus consultas.Por ejemplo:
La
person_fruit
tabla contiene una fila para cada fruta con la que una persona está asociada y enlaza efectivamente las tablasperson
yfruits
juntas, IECuando desee recuperar a una persona y toda su fruta, puede hacer algo como esto:
fuente
person_id
pero diferentefruit_name
. Esta es efectivamente una implementación de la teoría de la respuesta de Janus.person
mesa, cualquier información sobre la fruta en lafruits
mesa y cualquier información específicamente sobre la relación entre una persona en particular y una fruta en particular en laperson_fruit
mesa. Debido a que en este ejemplo no hay información adicional, laperson_fruit
tabla tiene solo dos columnas, las claves principales de las tablasperson
yfruits
.person_fruit
Sin embargo, la cantidad de una fruta específica es un ejemplo de otra cosa que podría ir en la mesa.INT
para una clavefruits
y solo tener estoINT
adentroperson_fruit
? Por lo tanto, el nombre se puede cambiar más tarde y también necesitaría menos espacio si no tiene muchas más filas dentrofruits
que dentroperson_fruit
.La razón por la que no hay matrices en SQL es porque la mayoría de las personas no las necesitan. Las bases de datos relacionales (SQL es exactamente eso) funcionan usando relaciones, y la mayoría de las veces, es mejor si asigna una fila de una tabla a cada "bit de información". Por ejemplo, cuando piense "Me gustaría una lista de cosas aquí", cree una nueva tabla, vinculando la fila de una tabla con la fila de otra tabla. [1] De esa forma, puede representar relaciones M: N. Otra ventaja es que esos enlaces no abarrotarán la fila que contiene el elemento vinculado. Y la base de datos puede indexar esas filas. Normalmente, las matrices no están indexadas.
Si no necesita bases de datos relacionales, puede utilizar, por ejemplo, un almacén de valores clave.
Lea sobre la normalización de la base de datos , por favor. La regla de oro es "[Cada] [atributo] que no sea clave debe proporcionar un hecho sobre la clave, la clave completa y nada más que la clave". Una matriz hace demasiado. Tiene múltiples hechos y almacena el orden (que no está relacionado con la relación en sí). Y el rendimiento es pobre (ver arriba).
Imagina que tienes una mesa de personas y tienes una mesa con llamadas telefónicas de personas. Ahora puede hacer que cada fila de persona tenga una lista de sus llamadas telefónicas. Pero cada persona tiene muchas otras relaciones con muchas otras cosas. ¿Eso significa que mi tabla de persona debe contener una matriz para cada cosa a la que está conectado? No, eso no es un atributo de la persona en sí.
[1]: ¡Está bien si la tabla de enlace solo tiene dos columnas (las claves primarias de cada tabla)! Sin embargo, si la relación en sí tiene atributos adicionales, deben representarse en esta tabla como columnas.
fuente
MySQL 5.7 ahora proporciona un tipo de datos JSON . Este nuevo tipo de datos proporciona una nueva forma conveniente de almacenar datos complejos: listas, diccionarios, etc.
Dicho esto, los rrays no mapean bien las bases de datos, por lo que los mapas relacionales de objetos pueden ser bastante complejos. Históricamente, las personas han almacenado listas / matrices en MySQL creando una tabla que las describe y agregando cada valor como su propio registro. La tabla puede tener solo 2 o 3 columnas, o puede contener muchas más. La forma de almacenar este tipo de datos realmente depende de las características de los datos.
Por ejemplo, ¿la lista contiene un número de entradas estático o dinámico? ¿La lista seguirá siendo pequeña o se espera que crezca a millones de registros? ¿Habrá muchas lecturas en esta mesa? ¿Muchas escrituras? ¿Muchas actualizaciones? Todos estos son factores que deben tenerse en cuenta al decidir cómo almacenar colecciones de datos.
Además, los almacenes de datos clave: valor / almacenes de documentos como Cassandra, MongoDB, Redis, etc. también proporcionan una buena solución. Solo tenga en cuenta dónde se almacenan realmente los datos (si se almacenan en el disco o en la memoria). No es necesario que todos sus datos estén en la misma base de datos. Algunos datos no se asignan bien a una base de datos relacional y es posible que tenga motivos para almacenarlos en otro lugar, o puede que desee utilizar una clave en la memoria: base de datos de valores como caché en caliente para los datos almacenados en el disco en algún lugar o como un almacenamiento efímero para cosas como sesiones.
fuente
Una nota al margen a considerar, puede almacenar matrices en Postgres.
fuente
En MySQL, use el tipo JSON.
Contrariamente a las respuestas anteriores, el estándar SQL ha incluido tipos de matrices durante casi veinte años; son útiles, incluso si MySQL no los ha implementado.
En su ejemplo, sin embargo, es probable que desee crear tres tablas: person y fruit, luego person_fruit para unirlas.
Si desea asociar a la persona con una variedad de frutas, puede hacerlo con una vista:
La vista muestra los siguientes datos:
En 5.7.22, querrá usar JSON_ARRAYAGG , en lugar de piratear la matriz a partir de una cadena.
fuente
Utilice el tipo de campo de base de datos BLOB para almacenar matrices.
Ref: http://us.php.net/manual/en/function.serialize.php
fuente
puedes almacenar tu matriz usando group_Concat así
AQUÍ un ejemplo en violín
fuente