在关系数据库中存储数组的最佳方式是什么?

问题描述 投票:0回答:1

我目前正在尝试设计一个数据库,但我不太确定处理我的对象之一的动态大小数组字段的最佳方法。我的第一个想法是使用对象中的列来存储整数数组。然而,我读得越多,我就越认为这不是最好的选择。具体示例,我有一个播放器对象,它存储 0 到多个项目,这些项目由整数表示。表示这一点的最佳方式是什么?

sqlite database-design relational-database
1个回答
33
投票

如果该值集合是原子,则将它们存储在一起。意思是,如果您始终关心整个组,如果您从不搜索嵌套值并且从不按嵌套值排序,那么它们应该作为单个字段值存储在一起。

如果不是原子的,它们应该存储在一个单独的表中,每个值带来一行,每个值分配另一个表上记录的父ID(外键),该表“拥有”它们作为一个组。

例如,来自科学仪器的一组读数仅作为分析集合一起使用,应该一起存储在一个字段中。相比之下,经常需要查询单个号码的客户电话号码列表可能应该分解为相关子表中每行的单个电话号码。

有关更多信息,请搜索术语“数据库规范化”。

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

如果您的数据库不支持数组作为列定义类型,那么您可能有三种选择:

  • XML/JSON
    将数据集合转换为 XMLJSON 文档(如果您的数据库支持该类型)。例如,Postgres 对使用 XPath 存储、检索和非索引搜索 XML 提供基本支持。 Postgres 为 JSON 作为一种数据类型提供了业界领先的卓越支持,包括使用其
    jsonb
    数据类型对嵌套值的索引支持,其中传入的 JSON 被解析并以内部定义的二进制格式存储。此功能解决了人们考虑使用所谓的“NoSQL”系统来存储和搜索半结构化数据的主要原因之一。
  • 文本
    创建数据的字符串表示形式以存储为文本。
  • BLOB
    创建一个二进制值以存储为二进制大对象 (BLOB)
© www.soinside.com 2019 - 2024. All rights reserved.