Maison >base de données >tutoriel mysql >MySQL a-t-il des tableaux ?

MySQL a-t-il des tableaux ?

WBOY
WBOYavant
2023-06-03 12:04:361238parcourir

Il n'y a pas de types de tableau dans MySQL. Les éléments du tableau sont généralement divisés par un certain caractère et stockés sous forme de chaîne. La raison pour laquelle il n'y a pas de tableaux dans MYSQL est que la plupart des gens n'en ont pas vraiment besoin. Dans les bases de données relationnelles, utilisant généralement un modèle relationnel, il est préférable d'attribuer chaque unité d'information à une ligne de tableau distincte. Par exemple, on pourrait penser "Je veux une liste de choses" et créer à la place une nouvelle table qui relie les lignes d'une table aux lignes d'une autre table, cela peut représenter une relation "M:N". La base de données peut indexer ces lignes ; les tableaux ne sont généralement pas indexés.

1. Les tableaux sont stockés sous forme de chaînes dans MySQL

Il n'y a pas de types de tableaux dans MySQL. Les éléments du tableau sont généralement divisés par certains caractères et stockés sous forme de chaînes

1.1. d'éléments dans le tableau

Méthode : diviser la chaîne selon le symbole spécifié et renvoyer le nombre d'éléments divisés. Le résultat souhaité peut être obtenu en comptant le nombre de délimiteurs dans la chaîne et en ajoutant 1. La méthode est très simple.

<code>CREATE function Get_StrArrayLength <br/>( <br/>@str varchar(1024), --要分割的字符串 <br/>@split varchar(10) --分隔符号 <br/>) <br/>returns int <br/>as <br/>begin <br/>declare @location int <br/>declare @start int <br/>declare @length int <br/>set @str=ltrim(rtrim(@str)) <br/>set @location=charindex(@split,@str) <br/>set @length=1 <br/>while @location<>0 <br/>begin <br/>set @start=@location+1 <br/>set @location=charindex(@split,@str,@start) <br/>set @length=@length+1 <br/>end <br/>return @length <br/>end<br/></code>

Exemple d'appel :

select  Get_StrArrayLength(&#39;78,1,2,3&#39;,&#39;,&#39;)

Valeur de retour :

4

1.2 Obtenez l'élément à la position spécifiée dans le tableau

Méthode : divisez la chaîne en fonction du symbole spécifié et renvoyez l'élément avec l'index spécifié. après le fractionnement (notez l'index à partir de 1), aussi pratique qu'un tableau

<code>CREATE function Get_StrArrayStrOfIndex <br/>( <br/>@str varchar(1024), --要分割的字符串 <br/>@split varchar(10), --分隔符号 <br/>@index int --取第几个元素 <br/>) <br/>returns varchar(1024) <br/>as <br/>begin <br/>declare @location int <br/>declare @start int <br/>declare @next int <br/>declare @seed int <br/>set @str=ltrim(rtrim(@str)) <br/>set @start=1 <br/>set @next=1 <br/>set @seed=len(@split) <br/>set @location=charindex(@split,@str) <br/>while @location<>0 and @index>@next <br/>begin <br/>set @start=@location+@seed <br/>set @location=charindex(@split,@str,@start) <br/>set @next=@next+1 <br/>end <br/>if @location =0 select @location =len(@str)+1 <br/>--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 <br/>return substring(@str,@start,@location-@start) <br/>end<br/></code>

Exemple d'appel :

select  Get_StrArrayStrOfIndex(&#39;8,9,4&#39;,&#39;,&#39;,2)

Valeur de retour :

9

1.3 Combinez les deux fonctions ci-dessus pour parcourir les éléments du tableau

Méthode. : Combinez les deux fonctions ci-dessus, comme Traverser les éléments de la chaîne comme un tableau

<code>declare @str varchar(50) <br/>set @str=&#39;1,2,3,4,5&#39; <br/>declare @next int <br/>set @next=1 <br/>while @next<=Get_StrArrayLength(@str,&#39;,&#39;) <br/>begin <br/>print Get_StrArrayStrOfIndex(@str,&#39;,&#39;,@next) <br/>set @next=@next+1 <br/>end<br/></code>

Résultat de l'appel :

1
2
3
4
5

2 Exemple de stockage d'un tableau (liste) dans MySQL

J'ai deux tables dans MySQL. La table Person a les colonnes suivantes :

id | name | fruits

La colonne fruit peut contenir des chaînes vides ou un tableau 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 colonne fruits de la première table afin qu'elle puisse contenir le tableau de chaînes qui prend la valeur de la colonne fruit_name de la deuxième table ? Puisqu'il n'y a pas de type de données tableau dans MySQL, que dois-je faire ?

Meilleure réponse :

La bonne méthode consiste à utiliser plusieurs tables et à les joindre dans la requête.

Par exemple : la table

CREATE TABLE person (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);
 
CREATE TABLE fruits (
`fruit_name` VARCHAR(20) NOT NULL PRIMARY KEY,
`color` VARCHAR(20),
`price` INT
);
 
CREATE TABLE person_fruit (
`person_id` INT NOT NULL,
`fruit_name` VARCHAR(20) NOT NULL,
PRIMARY KEY(`person_id`, `fruit_name`)
);

person_fruit contient une ligne pour chaque fruit auquel une personne est associée et relie efficacement les tables de personnes et de fruits entre elles.

1 | "banana"
1 | "apple"
1 | "orange"
2 | "straberry"
2 | "banana"
2 | "apple"

Lorsque vous souhaitez récupérer une personne et ses fruits, vous pouvez faire quelque chose comme ceci :

SELECT p.*, f.*
FROM person p
INNER JOIN person_fruit pf
ON p.id = pf.person_id
INNER JOIN fruits f
ON pf.fruit_name = f.fruit_name

Note 1 :

La raison pour laquelle il n'y a pas de tableaux dans SQL est que la plupart des gens n'en ont pas vraiment besoin il. Les bases de données relationnelles (c'est ce qu'est SQL) fonctionnent en utilisant des relations, et la plupart du temps, il est préférable d'avoir une ligne du tableau pour chaque « élément d'information ». Par exemple, vous pourriez penser "Je veux une liste de quelque chose ", mais créez plutôt un nouveau tableau qui relie les lignes d'une table aux lignes d'une autre table Lien . [1] De cette façon, vous pouvez représenter la relation M:N. Un autre avantage est que ces liens n’encombrent pas la ligne contenant l’élément lié. 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 d'une base de données relationnelle, vous pouvez utiliser par exemple un magasin clé-valeur.

"message. Phrase réécrite : Selon la règle d'or, chaque attribut non clé doit fournir des informations correspondantes pour la clé et l'ensemble du fait clé. " Le tableau en fait trop. Il a plusieurs faits, il stocke la commande (ce qui n'a rien à voir avec la relation elle-même). Les performances sont médiocres (voir ci-dessus

Imaginez que vous avez une table de personnes, vous avez une table). table qui peut permettre aux gens d'appeler. Vous pouvez désormais demander à chaque personne d'avoir sa liste de numéros de téléphone, mais chaque personne a de nombreuses autres relations avec beaucoup d'autres choses. Cela signifie-t-il que ma table de personnes doit contenir un tableau de tout ce à quoi elle est connectée ? pas une propriété de la personne elle-même.

[1] : Si la table liée n'a que deux colonnes (la clé primaire de chaque table), cela n'a pas d'importance si la relation elle-même a d'autres propriétés, elle doit être représentée dans ! ce tableau en tant que colonne.

Remarque 2 :

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.

Le mappage objet-relationnel peut être utilisé. être très complexe, car les Rrays ne sont pas mappés efficacement aux bases de données, historiquement, les gens créaient généralement des tables pour stocker des listes ou des tableaux et ajoutaient chaque valeur en tant qu'enregistrement. La table pouvait n'avoir que 2 ou 3 colonnes, ou en contenir davantage. Colonne. La manière de stocker ces données dépend vraiment des caractéristiques des données

Par exemple, la liste contiendra-t-elle un nombre statique ou dynamique d'entrées, ou la table devrait-elle atteindre des millions d'enregistrements ? de lecture ? Beaucoup d'écriture ? Ce sont tous des facteurs à prendre en compte lorsque vous décidez comment stocker votre collection de données.

De plus, les magasins de données/magasins de fichiers key:value comme Cassandra, MongoDB, Redis, etc. fournissent également une bonne solution. Notez où les données sont réellement stockées (si sur disque ou en mémoire). Toutes les données ne doivent pas nécessairement se trouver 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 souhaiterez peut-être utiliser une base de données clé: valeur en mémoire comme cache chaud pour les données stockées quelque part sur le disque ou comme stockage temporaire. comme des séances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer