我想存储一组每小时设定点。 24个浮点数(0到1),用于将当天的小时数映射到强度值。
我可以:
_0
到_23
。
(如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)(id, value, hour_of_the_day)
。这些值将主要一起查询并缩放(以便范围0到1映射)自定义范围。
哪种型号更受欢迎?
答案 0 :(得分:5)
这在很大程度上取决于用例和要求。
24个float
列,可能为空(您的第一个选项)是存储大小(因此速度)的最佳选择。每个float
8个字节(默认为float8
a.k.a。double precision
)或每个real
4个字节(float4
),无开销。由于只有24个给定的列,因此您将永远不会遇到设计问题,就像使用可变数字一样。
SQL中的合法标识符不能以数字开头。你必须总是双引号。容易出错并且容易混淆。使用字符前缀,例如h0
.. h23
。
一对多表格,主要表格为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倍。。
阵列?不要。存储比 1。(24字节的数组开销)更昂贵,处理最不方便,强制完整性(最大/准确长度)并不那么简单。
使用2.
,您需要连接两个表来读取数据,这样更昂贵。但是也有各种各样的优点。如果您经常需要读取或写入没有列h0
- h23
的主表,那么您会更便宜一点。更新单个值可能更便宜,因为主表保持不变。 OTOH,一次插入或更新相同id
的所有24个值通常更昂贵(1个新行版本与24个新行版本)。删除单个值对于 2来说更便宜。。
这些价值主要是一起查询......
1。。
。这会便宜很多。......并缩放
使用 2可能会更简单。:将相同的操作应用于一列而不是24列。
等。正如我所说,这在很大程度上取决于用例和要求。
相关: