在MYSQL中存储数组?

noo*_*oby 7 mysql nosql

我用谷歌搜索过。我不断收到与名为“serialize”的 PHP 函数有关的答案。我不会使用 PHP,所以遗憾的是该解决方案对我不起作用。

我之前使用过 NoSQL 数据库(我认为是 MongoDB),我基本上定义了一个集合

images [
    {"title": "Cute puppy", "file"="cute.png", "tags": ["cute", "puppy", "summer", "pool"]}
]
Run Code Online (Sandbox Code Playgroud)

我想在标签列的一行中存储多个值(老实说,我不知道我说得对不对,刚刚开始搜索MySQL)

+------------+----------+--------------------------+
| title      | file     | tags                     |
+------------+----------+--------------------------+
| Cute Puppy | cute.png | cute,puppy,summer,pool   |
+------------+----------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

我唯一的想法是,如果我使用 MySQL 来读取行,然后用逗号分隔标签,这很可能会起作用,但我可能会在百万。

我的问题是,如果你想在一列中存储多个值,MySQL 是一个不错的选择吗?

Vér*_*ace 8

My question really is, is MySQL a good choice if you want to store multiple values in one column?

\n

科德的规则

\n
    \n
  • 规则 2:保证访问规则:

    \n
      \n
    • 通过表名、主键值和列名的组合,保证关系数据库中的每个数据(原子值)都可以逻辑访问。
    • \n
    \n
  • \n
\n

请注意:第二条规则(实际上是第三条 - 以真正的极客风格从零开始编号)表明数组在关系系统中没有位置,但是没有理由不能将数组视为“原子” 。字符串(例如字符数组C)可以被认为是原子的,为什么数字数组(或其他数据类型)不能被认为是原子的。

\n

还应该认识到,数组非常有用并且确实对应于现实生活中的实体,因此包含数组类型和附带功能对于“现实主义者”来说应该不足为奇。Codd 的规则源自他对关系演算的研究,有人说完整的实现对于现实世界的 RDBMS 来说过于象牙塔。然而,我们已经超出了范围……

\n

问题:

\n

我建议这个问题的答案是否定的 - 在数据库服务器中的数组处理的所有 3 个级别上都有更好的选择。

\n
    \n
  1. 简单数组:\n==============
  2. \n
\n

MySQL 并没有真正的数组数据类型 -最接近的SET 数据类型,其功能非常有限。正如您在问题中注意到的那样,搜索会导致许多指向 PHP 代码的链接,这些代码在应用程序而不是数据库中实现数组功能。

\n

PostgreSQL 的ARRAY数据类型具有大量函数来处理、比较和查找数组中的元素。特别令人感兴趣的是UNNEST()STRING_TO_ARRAY()/REGEXP_SPLIT_TO_ARRAY()函数,它们提供了将数据移入数组和关系结构的便捷方法。

\n
    \n
  1. JSON:\n=====
  2. \n
\n

如今,数组已在很大程度上被 JSON 取代 - 这并不奇怪,因为 JSON 基本上是一个数组++(但是 XML--:-))。对于MySQLPostgreSQL来说都是如此。

\n

MySQLPostgreSQL这两个系统上都有大量可用的 JSON 函数,但 PostgreSQL 上的函数更多。我将交替使用术语 JSON 和 JSONB(二进制- 示例适用于 mongodb,但通常适用于二进制 JSON)。MySQL JSON 只是二进制,PostgreSQL 两者都有 - 但 JSONB 通常被认为更高效。请参阅这篇文章,详细讨论 PostgreSQL“NoSQL 类型”的用途。“NoSQL”这个词用词不当。您可以JOIN使用这些类型执行 SQL。

\n

关于索引 - MySQL 本质上是通过GENERATED 列 hack来实现的,而 PostgreSQL 为 JSONB 实现了 3 种索引(Gin、Btree 和 Hash - 请参阅8.14.4. jsonb Indexing 此处的部分)。

\n

MySQLPostgreSQL中的 JSON 和表之间都可以进行连接。

\n

总的来说,可以公平地说,JSON 在 PostgreSQL 中的存在时间比在 MySQL 中的历史更长,也更成熟。

\n

有报道称,使用 JSON 文档,PostgreSQL 实际上可以比 MongoDB表现得更好- 这里需要注意的是,这项研究是由作为 PostgreSQL 提供商的公司(EnterpriseDB 和 Ongres)完成的,但是他们执行的测试是开源的,并且因此可以接受审查。

\n

经典SQL:

\n

当然,您可以使用经典的关联实体方法来实现一些“多元素”功能。关联实体也称为 joiningbridgingmany-to-manym-to-n表。此处以注册大学课程的学生为例概述了该策略。

\n

1 门课程可以有多名学生,1 名学生可以参加多门课程。连接表包含PRIMARY KEY来自coursestudent表的 ,并且PK连接表本身是两个在一起的 - 学生不能在同一门课程中两次!

\n

Erwin Brandtstetter(一个非常值得听听有关数据库的人!)在他的回答中提到 JSON 解决方案时指出,支持经典方法:( Aside: A normalized DB design with basic data types would be way more efficient for this.)。JSON 并不是万能的,使用时必须进行判断。"[Cambrian Explosion][23]"近年来,从 2008 年到 2015 年,NoSQL 出现了很多流行趋势(尤其是 Mongodb)。现在,几乎所有 NoSQL 系统都已经或正在尝试将SQL 接口和工具放入其系统中。在我看来,如果您的数组相对简单,请坚持使用经典方法,否则请使用 JSONB。

\n

SQL 不是为操作逗号分隔的值列表而设计的,也不擅长操作逗号分隔的值列表。无论如何,他们都违反了科德规则第二条,该规则规定Each and every datum (atomic value) in a relational data base is guaranteed to be logically accessible by resorting to a combination of table name, primary key value and column name.:对于 .csv 列表,需要进一步的位置参数,SQL 不提供该参数,但各种系统都有“技巧”来解决这个问题。SQL 的堡垒\xc3\xa9 是由小的简单原子数据组成的“切片和切块”记录。

\n

PostgreSQL 是F/LOSS(免费/自由开源软件)系统,最接近为所有 3 种数组方法提供最佳性能。MySQL 更为广泛,并且可能具有更好的内置和第三方复制和/或分片,但 PostgreSQL 更符合标准,并且最近在这些领域取得了长足进步。它还具有卓越的 JSONB 功能。

\n