在Postgres中存储小型固定长度数组的最佳数据模型(使用SqlAlchemy)

时间:2016-07-22 23:51:02

标签: postgresql python-3.x database-design sqlalchemy data-modeling

我想存储一组每小时设定点。 24个浮点数(0到1),用于将当天的小时数映射到强度值。

我可以:

  1. 有24列,名为_0_23。 (如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)
  2. 有一个值表(id, value, hour_of_the_day)
  3. 使用postgres array type。 (但似乎我不能有固定长度的数组,我需要一些应用程序逻辑来获取/设置值。)
  4. 这些值将主要一起查询并缩放(以便范围0到1映射)自定义范围。

    哪种型号更受欢迎?

1 个答案:

答案 0 :(得分:5)

这在很大程度上取决于用例和要求。

1。

24个float,可能为空(您的第一个选项)是存储大小(因此速度)的最佳选择。每个float 8个字节(默认为float8 a.k.a。double precision)或每个real 4个字节(float4),无开销。由于只有24个给定的列,因此您将永远不会遇到设计问题,就像使用可变数字一样。

SQL中的合法标识符不能以数字开头。你必须总是双引号。容易出错并且容易混淆。使用字符前缀,例如h0 .. h23

2

一对多表格,主要表格为id的FK约束。您可以使(id int, hour_of_the_day int, value float8),而不是(id, value, hour_of_the_day),没有浪费空间来进行对齐填充。添加CHECK约束仅允许hour_of_the_day的值0 - 23。

1相比,这会使存储大小倍增。:每个单独的行占用大约44个字节。每行28字节的开销+数据的16字节。您至少在(id, hour_of_the_day)上添加PK约束,该约束是使用btree索引实现的(与表类似的页面和行结构)。这会增加每行36个字节。因此,我们最终每个值至少有80个字节(加上每个数据页和表的开销)。大约 1的存储容量的10倍。

3

阵列?不要。存储比 1。(24字节的数组开销)更昂贵,处理最不方便,强制完整性(最大/准确长度)并不那么简单。

更多优点和缺点

使用2.,您需要连接两个表来读取数据,这样更昂贵。但是也有各种各样的优点。如果您经常需要读取或写入没有列h0 - h23的主表,那么您会更便宜一点。更新单个值可能更便宜,因为主表保持不变。 OTOH,一次插入或更新相同id的所有24个值通常更昂贵(1个新行版本与24个新行版本)。删除单个值对于 2来说更便宜。

  

这些价​​值主要是一起查询......

1。

。这会便宜很多。
  

......并缩放

使用 2可能会更简单。:将相同的操作应用于一列而不是24列。

等。正如我所说,这在很大程度上取决于用例和要求。

相关: