J'ai deux tables dans MySQL. Table Person contient les colonnes suivantes:
id | name | fruits
La fruits
colonne peut contenir null ou un tableau de chaînes comme ('pomme', 'orange', 'banane'), ou ('fraise'), etc. La deuxième table est Table Fruit et comporte les trois colonnes suivantes:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Alors, comment dois-je concevoir la fruits
colonne dans la première table afin qu'elle puisse contenir un tableau de chaînes qui prennent des valeurs de la fruit_name
colonne dans la deuxième table? Puisqu'il n'y a pas de type de données de tableau dans MySQL, comment dois-je le faire?
mysql
database-schema
Tonga
la source
la source
Réponses:
La bonne façon de procéder consiste à utiliser plusieurs tables et
JOIN
celles - ci dans vos requêtes.Par exemple:
Le
person_fruit
tableau contient une ligne pour chaque fruit auquel une personne est associée et relie efficacement les tableauxperson
etfruits
ensemble, IELorsque vous souhaitez récupérer une personne et tous ses fruits, vous pouvez faire quelque chose comme ceci:
la source
person_id
mais un différentfruit_name
. Il s'agit en fait d'une mise en œuvre de la théorie de la réponse de Janus.person
tableau, toute information sur le fruit dans lefruits
tableau et toute information spécifique sur la relation entre une personne en particulier et un fruit particulier dans leperson_fruit
tableau. Étant donné que dans cet exemple, il n'y a pas d'informations supplémentaires, laperson_fruit
table ne comporte que deux colonnes, les clés primaires des tablesperson
etfruits
. La quantité d'un fruit spécifique est cependant un exemple d'autre chose qui pourrait figurer dans leperson_fruit
tableau.INT
pour une cléfruits
et que cetteINT
enperson_fruit
? Ainsi, le nom peut être changé plus tard et aurait également besoin de moins d'espace si vous n'avez pas beaucoup plus de lignes dansfruits
que dansperson_fruit
.La raison pour laquelle il n'y a pas de tableaux en SQL est que la plupart des gens n'en ont pas vraiment besoin. Les bases de données relationnelles (SQL est exactement cela) fonctionnent à l'aide de relations, et la plupart du temps, il est préférable d'attribuer une ligne d'une table à chaque "bit d'information". Par exemple, là où vous pouvez penser "Je voudrais une liste de choses ici", créez plutôt un nouveau tableau, en liant la ligne d'une table à la ligne d'une autre table. [1] De cette façon, vous pouvez représenter les relations M: N. Un autre avantage est que ces liens n'encombreront pas la ligne contenant l'élément lié. Et la base de données peut indexer ces lignes. Les tableaux ne sont généralement pas indexés.
Si vous n'avez pas besoin de bases de données relationnelles, vous pouvez utiliser par exemple un magasin clé-valeur.
En savoir plus sur la normalisation de la base de données , s'il vous plaît. La règle d'or est "[Chaque] [attribut] non clé doit fournir un fait sur la clé, la clé entière et rien d'autre que la clé.". Un tableau fait trop. Il a plusieurs faits et il stocke l'ordre (qui n'est pas lié à la relation elle-même). Et les performances sont médiocres (voir ci-dessus).
Imaginez que vous ayez une table de personne et une table avec des appels téléphoniques de personnes. Vous pouvez maintenant faire en sorte que chaque ligne de personne ait une liste de ses appels téléphoniques. Mais chaque personne a beaucoup d'autres relations avec beaucoup d'autres choses. Cela signifie-t-il que ma table person doit contenir un tableau pour chaque élément auquel il est connecté? Non, ce n'est pas un attribut de la personne elle-même.
[1]: Ce n'est pas grave si la table de liaison n'a que deux colonnes (les clés primaires de chaque table)! Si la relation elle-même a des attributs supplémentaires, ils doivent être représentés dans ce tableau sous forme de colonnes.
la source
MySQL 5.7 fournit désormais un type de données JSON . Ce nouveau type de données offre une nouvelle façon pratique de stocker des données complexes: listes, dictionnaires, etc.
Cela dit, les rrays ne mappent pas bien les bases de données, c'est pourquoi les cartes relationnelles objet peuvent être assez complexes. Historiquement, les gens ont stocké des listes / tableaux dans MySQL en créant une table qui les décrit et en ajoutant chaque valeur comme son propre enregistrement. Le tableau peut avoir seulement 2 ou 3 colonnes, ou il peut en contenir beaucoup plus. La manière dont vous stockez ce type de données dépend vraiment des caractéristiques des données.
Par exemple, la liste contient-elle un nombre statique ou dynamique d'entrées? La liste restera-t-elle petite ou devrait-elle atteindre des millions d'enregistrements? Y aura-t-il beaucoup de lectures sur cette table? Beaucoup d'écritures? Beaucoup de mises à jour? Ce sont tous des facteurs dont il faut tenir compte pour décider de la manière de stocker les collections de données.
En outre, les magasins de données Key: Value / les magasins de documents tels que Cassandra, MongoDB, Redis, etc. fournissent également une bonne solution. Soyez juste conscient de l'endroit où les données sont réellement stockées (si elles sont stockées sur disque ou en mémoire). Toutes vos données ne doivent pas nécessairement être dans la même base de données. Certaines données ne correspondent pas bien à une base de données relationnelle et vous pouvez avoir des raisons de les stocker ailleurs, ou vous pouvez utiliser une clé en mémoire: base de données de valeurs comme hot-cache pour les données stockées sur disque quelque part ou comme stockage éphémère pour des choses comme des sessions.
la source
Remarque à prendre en compte, vous pouvez stocker des tableaux dans Postgres.
la source
Dans MySQL, utilisez le type JSON.
Contre les réponses ci-dessus, la norme SQL inclut des types de tableaux depuis près de vingt ans; ils sont utiles, même si MySQL ne les a pas implémentés.
Dans votre exemple, cependant, vous voudrez probablement créer trois tables: person et fruit, puis person_fruit pour les rejoindre.
Si vous souhaitez associer la personne à un éventail de fruits, vous pouvez le faire avec une vue:
La vue montre les données suivantes:
Dans 5.7.22, vous voudrez utiliser JSON_ARRAYAGG , plutôt que de pirater le tableau ensemble à partir d'une chaîne.
la source
Utilisez le type de champ de base de données BLOB pour stocker les tableaux.
Réf: http://us.php.net/manual/en/function.serialize.php
la source
vous pouvez stocker votre tableau en utilisant group_Concat comme ça
ICI un exemple en violon
la source