如何在MySQL中存储数组?

我在MySQL中有两个表。 表人员具有以下列:

id | name | fruits 

fruits列可以保留null或一串(如'苹果','橙','香蕉')或('草莓')等string。第二个表是Table Fruit,它有以下三列:

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

那么应该如何devise第一个表中的fruits列,以便它可以容纳从第二个表中的fruit_name列获取值的string数组? 由于MySQL中没有数组数据types,我该怎么做呢?

做到这一点的正确方法是使用多个表,并在查询中JOIN它们。

例如:

 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表包含一个人关联的每个水果的一行,并有效地将person fruits表链接在一起,IE

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

当你想检索一个人和他们所有的水果,你可以做这样的事情:

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

SQL中没有数组的原因是因为大多数人并不需要它。 关系数据库(SQL就是这样)使用关系来工作,大多数情况下,最好是将一行表分配给每个“信息位”。 例如,你可能会想:“我想在这里列出一些东西”,而是build立一个新的表,将一个表中的行与另一个表中的行连接起来[1]。 这样,你可以表示M:N关系。 另一个优点是这些链接不会混乱包含链接项目的行。 数据库可以索引这些行。 数组通常不被索引。

如果您不需要关系数据库,则可以使用例如键值存储。

请阅读关于数据库规范化 。 黄金法则是“每一个非关键属性都必须提供一个事实关键,全部关键,而不是关键”。 数组做的太多了。 它具有多个事实,它存储命令(与关系本身无关)。 performance不佳(见上文)。

想象一下,你有一个人桌子,你有一个桌子上的人打电话。 现在你可以让每个人都有他的电话列表。 但是每个人都有许多其他的关系。 这是否意味着我的人表应该包含他连接的每一个单一的数组? 不,这不是人本身的属性。

[1]:如果链接表只有两列(每个表中的主键),那就好了! 如果关系本身具有其他属性,则应该在此表中将它们表示为列。

编辑:

(2016年3月10日)

MySQL 5.7现在提供了一个JSON数据types。 这个新的数据types提供了一个方便的新方法来存储复杂的数据:列表,字典等。

数组不能很好地映射数据库,这就是为什么对象 – 关系映射可能非常复杂。 历史上,人们通过创build一个表来描述它们,并将每个值添加为自己的logging,从而在MySQL中存储了列表/数组。 该表可能只有2或3列,或者可能包含更多。 如何存储这种types的数据真的取决于数据的特征。

例如,列表是否包含静态或dynamic数量的条目? 名单会不会很小,还是会增长到数百万条? 这张桌子上会有很多的读物吗? 很多写道? 很多更新? 这些都是决定如何存储数据集合时需要考虑的因素。

此外,关键:价值数据存储/文件存储,如Cassandra,MongoDB,Redis等也提供了一个很好的解决scheme。 只要知道数据实际存储的位置(如果存储在磁盘或内存中)。 不是所有的数据都需要在同一个数据库中。 有些数据不能很好地映射到关系数据库,而且您可能有其他原因存储的原因,或者您可能希望使用内存中的键:值数据库作为磁盘上存储的数据的热caching或作为临时存储像会议的东西。

要考虑的一个方面,你可以在Postgres中存储数组。

使用数据库字段typesBLOB来存储数组。

参考: http : //us.php.net/manual/en/function.serialize.php

返回值

返回一个string,其中包含可以存储在任何位置的值的字节stream表示forms。

请注意,这是一个可能包含空字节的二进制string,需要进行存储和处理。 例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是CHAR或TEXT字段。

你可以使用group_Concat来存储你的数组

  INSERT into Table1 (fruits) (SELECT GROUP_CONCAT(fruit_name) from table2) WHERE ..... //your clause here 

这里是一个小提琴的例子