Ala*_*405 3 postgresql database-design sqlalchemy data-modeling python-3.x
我想存储一组每小时设定点.24个浮点数(0到1),用于将当天的小时数映射到强度值.
我可以:
_0为_23.(如何在Sqlalchemy中扩展db.Model以使用数字作为列名?)(id, value, hour_of_the_day).这些值将主要一起查询并缩放(以便范围0到1映射)自定义范围.
哪种型号更可取?
这在很大程度上取决于用例和要求.
24个单独的float列,可能是可空的(您的第一个选项)是存储大小(因此速度)的最佳选择.每个8字节float(默认为float8aka double precision)或每个real(float4)4个字节,没有开销.由于恰好有24个给定列,因此您将永远不会遇到设计问题,就像使用可变数字一样.
SQL中的合法标识符不能以数字开头.你必须总是双引号.容易出错并且容易混淆.使用字符的前缀,像h0.. h23.
一个一个一对多表与FK约束idOT了主表.您可以这样做,(id int, hour_of_the_day int, value float8)但不会(id, value, hour_of_the_day)浪费任何空间来进行对齐填充.添加CHECK约束以仅允许值0 - 23 hour_of_the_day.
与1相比,这会使存储大小倍增:每个单独的行占用大约44个字节.每行28字节的开销+数据的16字节.您至少添加了一个(id, hour_of_the_day)使用btree索引实现的PK约束(与表类似的页面和行结构).这会增加每行36个字节.因此,我们最终每个值至少有80个字节(加上每个数据页和表的开销).大约10倍的存储大小为1.
阵列?别.存储比1.更昂贵(24字节的数组开销),处理最不方便,强制完整性(最大/确切长度)并不那么简单.
有了2.你需要连接两个表来读取数据,这是比较昂贵.但是也有各种各样的优点.如果你经常需要读取或写入没有列的主表h0- h23你会更便宜一点.更新单个值可能更便宜,因为主表保持不变.OTOH,一次插入或更新相同的所有24个值id通常更昂贵(1个新行版本与24个新行版本).删除单个值对于2来说更便宜.
这些值大多会一起查询......
这是便宜了不少与1.
...并缩放
使用2可能更简单:将相同的操作应用于一列而不是24列.
等等.正如我所说,它在很大程度上取决于用例和要求.
有关:
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |