ホームページ  >  記事  >  データベース  >  mysqlには配列がありますか?

mysqlには配列がありますか?

WBOY
WBOY転載
2023-06-03 12:04:361212ブラウズ

MySQL には配列型はなく、通常、配列要素は特定の文字で分割され、文字列形式で格納されます。 MYSQL に配列がないのは、ほとんどの人が実際には配列を必要としないためです。リレーショナル データベースでは、通常はリレーショナル モデルを使用し、情報の各単位を別のテーブル行に割り当てるのが最適です。たとえば、「もののリストが欲しい」と考え、代わりに、あるテーブルの行を別のテーブルの行に関連付ける新しいテーブルを作成する場合があります。これは、「M:N」関係を表すことができます。データベースはこれらの行にインデックスを付けることができますが、通常、配列にはインデックスが付けられません。

1. MySQL は配列を文字列の形式で保存します

MySQL には配列型はありません。通常、配列要素は特定の文字によって文字列に分割されます。 . ストレージのフォーマット

1.1. 配列の要素数を求める

メソッド: 指定された記号に従って文字列を分割し、分割後の要素数を返します。文字列内の区切り文字の数を数えて 1 を加算すると、必要な結果が得られます。方法は非常に簡単です。

<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>

呼び出し例:

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

戻り値:

4

1.2. 配列内の指定位置の要素を取得

メソッド: 指定されたシンボルに従って文字列を分割し、分割後に指定されたインデックスの要素を返します (インデックスは 1 から始まることに注意してください)。配列のように便利です。

<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>

呼び出し例:

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

戻り値:

9

1.3. 上記 2 つの関数を組み合わせて配列内の要素を走査します

メソッド: 上記 2 つの関数を組み合わせて要素を走査します配列のような文字列

<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>

呼び出し結果:

1
2
3
4
5

2. MySQLに配列(リスト)を格納する例

テーブルが2つありますMySQLで。テーブル Person には次の列があります。

id | name | fruits

フルーツ列には、空の文字列または ('apple'、'orange'、'banana') や ('strawberry') などの文字列の配列を含めることができます。 2 番目のテーブルは Table Fruit で、次の 3 つの列があります:

____________________________
fruit_name | color  | price
____________________________
apple      | red    | 2
____________________________
orange     | orange | 3
____________________________
...,...

それでは、2 番目のテーブルの Fruit_name 列から値を取得できるようにするには、最初のテーブルの Fruit 列をどのように設計すればよいでしょうか String 配列? MySQL には配列データ型がないのですが、どうすればよいでしょうか?

ベストアンサー:

正しい方法は、複数のテーブルを使用し、それらをクエリ内で結合することです。

例:

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テーブルには、人物に関連付けられている果物ごとに行が含まれており、人物テーブルと果物テーブルを効果的にリンクします。

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

人物とそのフルーツを取得したい場合は、次のようなことができます:

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

命令 1:

SQL に配列がない理由は、ほとんどの人が実際には配列を必要としないためです。リレーショナル データベース (SQL がそれです) はリレーションシップを使用して機能します。ほとんどの場合、「情報のビット」ごとにテーブルの 1 行を用意するのが最適です。

たとえば、「 物事のリスト が欲しい」と考えるかもしれませんが、代わりに を作成します。あるテーブルの行を別のテーブルの 行に関連付ける新しいテーブル [1] このようにして、M:N の関係を表すことができます。もう 1 つの利点は、これらのリンクによって、リンクされた項目を含む行が乱雑にならないことです。データベースはこれらの行にインデックスを付けることができます。通常、配列にはインデックスが付けられません。 リレーショナル データベースが必要ない場合は、キー/値ストアなどを使用できます。 ######"情報。 書き直された文: 黄金律に従って、各非キー属性は、キーとキー ファクト全体に対応する情報を提供する必要があります。 「配列はやりすぎです。配列には複数のファクトがあり、順序 (リレーションシップ自体とは関係ありません) が保存されます。パフォーマンスは悪いです (上記を参照)。 人々のテーブルがあると想像してください。人々が電話をかけることができるテーブルです。これで、各人に自分の電話リストを持たせることができます。しかし、各人は他の多くのものと他の多くの関係を持っています。これは、私の人物テーブルには、その人が接続しているすべてのものを含める必要があるという意味ですか? ものの配列? いいえ、それはその人自体のプロパティではありません。

[1]: リンクされたテーブルに 2 つの列 (各テーブルの主キー) しかない場合は、問題ありません! リレーションシップ自体に他のプロパティがある場合は、

注 2:

MySQL 5.7 では、JSON データ型が提供されるようになりました。この新しいデータ型は、ストレージを提供します。複雑なデータのメソッド: リスト、辞書など。

オブジェクト リレーショナル マッピングは、Rray をデータベースに効率的にマッピングできないため、非常に複雑になる可能性があります。MySQL では、歴史的に、人々は通常、リストまたは配列を保存するテーブルを作成し、各値はレコードとして扱われます。テーブルには 2 つまたは 3 つの列しかない場合もあれば、それ以上の列が含まれる場合もあります。このタイプのデータをどのように保存するかは、実際にはデータの特性によって異なります。

たとえば、リストは次のようになります。エントリの数は静的か動的か? リストは小さいままでしょうか、それとも数百万レコードに増加すると予想されますか? このテーブルで大量の読み取りが行われますか? 大量の書き込みが行われますか? 大量の更新が行われますか? これらは重要な考慮事項です。データ コレクションの保存方法を決定するときは、これらすべての要素を考慮する必要があります。

さらに、Cassandra、MongoDB、Redis などのキー:バリュー データ ストア/ファイル ストアも優れたソリューションを提供します。データが実際に保存される場所 (ディスク上またはメモリ上の場合) に注意してください。すべてのデータが同じデータベースにある必要はありません。一部のデータはリレーショナル データベースに適切にマップされず、それを別の場所に保存する理由がある場合や、ディスク上のどこかに保存されたデータのホット キャッシュまたは一時ストレージとしてメモリ内の key:value データベースを使用したい場合があります。セッションのような。

以上がmysqlには配列がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。