在关系型数据库中,最好的存储数组的方法是什么?

17

我目前正在设计一个数据库,不确定如何最好地处理对象中动态大小的数组字段。我的第一反应是在对象中使用一列来存储整数数组。然而,我读得越多,就越觉得这不是最佳选项。举个具体例子,我有一个玩家对象,存储着0到多个物品,这些物品由一个整数表示。那么,最好的表示方法是什么呢?

1个回答

32

如果这一组值是原子化的,就将它们存储在一起。也就是说,如果你总是关心整个组合,从未搜索嵌套值,并且从不按嵌套值排序,则应将它们作为单个字段值存储在一起。

如果不是,则应将它们存储在一个单独的表中,每个值成为一行,每个行都分配一个父ID(外键),指向另一个表上“拥有”它们的记录。

例如,科学仪器产生的读数集合只被当做一组进行分析,应该存储在一个字段中。相反,客户电话号码列表可能需要经常查询某个单独的号码,因此应该将其拆分为单个电话号码,并存储在相关的子表中。

要了解更多信息,请搜索术语“数据库规范化”。

一些数据库支持数组作为数据类型。例如,Postgres允许您将列定义为一维数组,甚至是二维数组。

如果数据库不支持数组作为列定义类型,则您可能有三个替代方案:

  • XML/JSON
    如果您的数据库支持,将您的数据收集转换为XMLJSON文档。例如,Postgres具有基本支持,可以使用XPath存储、检索和非索引搜索XML,而Postgres则提供了出色的行业领先的JSON支持,包括对嵌套值的索引支持,其jsonb数据类型以一种内部定义的二进制格式解析和存储传入的JSON。此功能解决了人们考虑使用所谓的“NoSQL”系统的主要原因之一,即希望存储和搜索半结构化数据
  • Text
    创建数据的字符串表示形式以存储为文本。
  • BLOB
    创建二进制值以存储为二进制大对象(BLOB)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接