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

时间:2016-04-17 15:36:18

标签: sqlite database-design relational-database

我目前正在尝试设计一个数据库,而且我不太确定接近其中一个对象的动态大小的数组字段的最佳方法。我的第一个想法是在我的对象中使用一列来存储一个整数数组。然而,我读的越多,我认为这不是最好的选择。具体的例子,我有一个玩家对象,存储0到多个项目,由一个整数表示。代表这个的最佳方式是什么?

1 个答案:

答案 0 :(得分:13)

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

如果没有,它们应该存储在一个单独的表中,每个值都带一行,每一行都分配了另一个表中“拥有”它们作为一个组的记录的父ID(foreign key)。

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

有关详细信息,请搜索“database normalization”一词。

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

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

  • XML / JSON
    如果数据库支持该类型的数据库,则将数据集合转换为XMLJSON文档。例如,Postgres基本支持使用XPath存储,检索和非索引式搜索XML。 Postgres为JSON提供了出色的行业领先支持,作为一种数据类型,包括对嵌套值的索引支持及其jsonb数据类型,其中传入的JSON以内部定义的二进制格式进行解析和存储。此功能解决了人们考虑使用所谓的“NoSQL”系统,寻找存储和搜索semi-structured data的主要原因之一。
  • 文本
    创建要作为文本存储的数据的字符串表示。
  • BLOB
    创建二进制值以存储为binary large object (BLOB)