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

Postgresql 在Postgres中存储小型固定长度数组的最佳数据模型(使用SqlAlchemy),postgresql,python-3.x,database-design,sqlalchemy,data-modeling,Postgresql,Python 3.x,Database Design,Sqlalchemy,Data Modeling,我想存储一组每小时的设定值。24个浮动(0到1),将一天中的小时映射为强度值 我可以: 有24列名为\u 0到\u 23。 (如何在Sqlalchemy中扩展db.Model以使用数字作为列名?) 有一个值表(id、值、当天的小时数) 使用。(但似乎我不能使用固定长度数组,我需要一些应用程序逻辑来获取/设置值。) 这些值大部分将一起查询并缩放(以便0到1的范围映射)自定义范围 哪个模型更可取?这在很大程度上取决于用例和需求 1. 24个单独的floatcolumns,可能为空(您的第一个选项)是

我想存储一组每小时的设定值。24个浮动(0到1),将一天中的小时映射为强度值

我可以:

  • 有24列名为
    \u 0
    \u 23
    。 (如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)
  • 有一个值表
    (id、值、当天的小时数)
  • 使用。(但似乎我不能使用固定长度数组,我需要一些应用程序逻辑来获取/设置值。)
  • 这些值大部分将一起查询并缩放(以便0到1的范围映射)自定义范围


    哪个模型更可取?

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

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

    SQL中的合法标识符不能以数字开头。你必须总是重复报价。容易出错且容易混淆。使用字符前缀,如
    h0
    <代码>h23

    2. 一个一对多表,对主表的
    id
    具有FK约束。您可以使
    (id int,hour\u of \u day int,value float8)
    ,而不是
    (id,value,hour\u of \u day)
    ,不会浪费空间进行对齐填充。添加一个
    检查
    约束,只允许一天中
    小时的值为0-23

    与1相比,存储大小增加了一倍。每个单独的行占用大约44个字节。每行28字节的开销+数据的16字节。您至少可以在
    (id,hour\u of \u the \u day)
    上添加一个PK约束,该约束是使用btree索引(类似于表的页面和行结构)实现的。这将每行再添加36个字节。因此,每个值至少有80个字节(加上每个数据页和表的开销)。大约是存储大小的10倍

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

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

    这些值将主要一起查询

    1.这样便宜多了

    。。。缩放

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

    如我所说,这在很大程度上取决于用例和需求

    相关的:


    值(0到1)
    应该表示我假设的
    布尔非空值
    值?我进行了编辑以使其更清晰。没有0或1值,但值从0规范化为1。它基本上是一组设定点。