【问题标题】:Why are arrays not saveable in sql为什么数组不能保存在sql中
【发布时间】:2018-09-07 14:44:29
【问题描述】:

我知道 sql 不能保存数组(如果我错了,请纠正我)。
为什么?
我知道这是一个愚蠢的问题,但是
数组只是结构化数据。为什么sql不能保存?

我可以重写我的 mysql 数据库或下载一个 Addon for sql 以便我可以保存数组吗?

提前致谢

【问题讨论】:

  • 在 SQL 世界中,您应该规范化您的数据。数组不是原子的(您可能想要引用数组的特定元素而不是整个数组)。无论如何,PostgresSQL/Oracle 允许存储数组。
  • 如果你想使用数组你可以使用NOSQL
  • Sql 可以存储序列化数据,E.G Json 或者 XML,你可以用它来保存数组

标签: mysql sql arrays


【解决方案1】:

关系数据库管理系统 (RDBMS),例如 MySQL、SQL Server、Oracle 和 PostgreSQL,通常将数据存储在表中。这是存储相关数据的好方法。

假设存在三个实体:客户、订单和产品,并且订单包含多个产品。因此有四个表:

  • 客户(客户编号,姓名)
  • 产品(产品编号、名称、价格)
  • 订单(订单号、客户号、日期)
  • order_details(order_no, product_no, amount)

我们将提供索引(即搜索树),以便轻松查找客户的订单或订单中的产品。现在假设,我们想知道产品 123 的订单数量:

select count(distinct order_no)
from order_details
where product_no = 123;

DBMS 将快速找到该产品的 order_detail 记录,因为查找索引就像在电话簿中按姓氏搜索(二进制搜索)。然后它只是计数。所以只有很少的记录被读取,整个查询非常快。

现在数组也是如此。比如:

products(product_no, name, price)

customers
(
  customer_no,
  name, 
  array of orders
  (
    order_no, 
    date,
    array of products
    (
      product_no,
      amount
    )
  )
)

好吧,订单详细信息现在隐藏在一个订单元素中,该元素本身位于一个客户对象中。要获得产品 123 的订单数量,唯一的方法似乎是读取 所有 客户记录,遍历 所有 订单并查看它们是否包含该产品。这可能需要很长时间。此外,如果实体之间的关系没有外键约束,数组可能包含甚至不存在的产品编号。

好吧,可能有一些方法可以对数组数据进行索引,并且可能有一些方法可以保证它们的数据一致性,但是表的关系方法已经证明可以很好地解决这些问题。所以我们会避免使用数组,而是建立与表的关系。这就是关系数据库的用途。

(话虽如此,数组可能会时不时地派上用场,例如,在递归查询中,您是否想记住哪些记录已经被访问过,但这种情况很少见。)

【讨论】:

    【解决方案2】:

    要回答我自己的问题,我首先要感谢 cmets
    谢谢!
    回到问题:由于normalization问题,普通sql无法保存数组,不想保存。

    您可以通过其他方式保存数组:
    SQL 表就像一个数组。将新表链接为数组。手动创建表,或者,如果数组可以更改,则使用 Code。 sql中不需要数组

    如果您必须这样做,或者想要这样做,您可以使用 Nosql 或 PostgreSql 或使用 JSON、Oracle 和 XML 保存数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多