Postgresql 在Postgres中存储小型固定长度数组的最佳数据模型(使用SqlAlchemy)
我想存储一组每小时的设定值。24个浮动(0到1),将一天中的小时映射为强度值 我可以: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,可能为空(您的第一个选项)是
\u 0
到\u 23
。
(如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)(id、值、当天的小时数)
哪个模型更可取?这在很大程度上取决于用例和需求 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。它基本上是一组设定点。