首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在以下情况下,是否使用PostgreSQL数组类型?

在以下情况下,是否使用PostgreSQL数组类型?
EN

Stack Overflow用户
提问于 2010-01-05 01:08:20
回答 2查看 1.9K关注 0票数 1

我正在使用PostgreSQL。

我知道PostgreSQL有数组数据类型。

http://www.postgresql.org/docs/8.1/interactive/arrays.html

目前,我需要使用数据库来存储半导体工厂的测量结果。

他们正在生产半成品。每个半导体单元都可以有可变数量的测量参数。

我计划用以下的方式设计这张桌子。

代码语言:javascript
复制
SemicondutorComponent
=====================
ID |


Measurement
=================
ID | Name | Value | SemicondutorComponent_ID

数据示例:

代码语言:javascript
复制
SemicondutorComponent
=====================
1 |
2 |

Measurement
=================
1 | Width       | 0.001 | 1
2 | Height      | 0.021 | 1
3 | Thickness   | 0.022 | 1
4 | Pad0_Length | 0.031 | 1
5 | Pad1_Width  | 0.041 | 1
6 | Width       | 0.001 | 2
7 | Height      | 0.021 | 2
8 | Thickness   | 0.022 | 2
9 | Pad0_Length | 0.031 | 2
10| Pad1_Width  | 0.041 | 2
11| Pad2_Width  | 0.041 | 2
12| Lead0_Width | 0.041 | 2

假设一家工厂在一天内生产2400万台

SemicondutorComponent表将在1天内拥有2400万行

假设一个SemicondutorComponent单元有50个测量参数。(可以多一些,也可以少一些,这取决于SemicondutorComponent类型)

测量表在一天内将有24 *5000万行。

这样的设计有效吗?

我希望有超快的写入速度,以及从数据库中合理的快速读取速度。

还是我应该使用PostgreSQL阵列设备?

代码语言:javascript
复制
SemicondutorComponent
=====================
ID | Array_of_measurement_name | Array_of_measurement_value
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-05 01:28:06

我不能评论数组与普通表的写入速度,但据我所知,使用2个数组的设计对于查询来说将非常麻烦。

我也不知道读取数组的性能,但从文档中可以看出,所有数组访问都是通过位置引用(索引)完成的,因此在后面查找特定的度量将是一个巨大的痛苦--您必须遍历名称数组来找到适当的索引,然后使用它来找到值。我怀疑它是否可以在纯SQL中完成,它可能需要一个用户定义的函数。

关于表的设计:您似乎关心的是写的速度。每天有2400万个组件,即每小时100万行,这并不多。在最坏的情况下,对于测量值,是每小时5100万行,所以每分钟不到100万行。我认为这应该是可行的,尽管应该对插入进行批处理,并避免在许多短暂的事务中执行许多行插入(最好将它们插入并以包的形式提交,比如10.000或100.000)。

我确实认为您还需要设计一个归档和/或聚合解决方案,因为继续插入这些卷似乎不太容易维护。我怀疑它也是有用的,但也许这只是我不理解这个数据库的目的。我的意思是,在我看来,你不太可能想要精确地确定一个组成部分的不可分割的测量,比如说,在它被制造一年之后。然而,保持像平均值、最小值、最大值和stddev测量值这样的统计数据似乎很有用。但也许你可以解释一下。

我想到的另一件事是,它可以帮助首先将原始测量数据存储在一个廉价而快速的日志中(仅仅是文本文件,比如CSV格式),然后使用多个读取器读取这些数据并将它们插入数据库。这些读者可以以一种相当稳定的方式运行。这将减少数据库的瓶颈,并使系统更加健壮(假设日志持续工作的可能性高于数据库崩溃的可能性)。当然,如果您需要从db实时报告来监视流程,这种方法就不太适合了(不过,在我看来,您需要在单独的组件级别上这样做似乎很奇怪)。

票数 3
EN

Stack Overflow用户

发布于 2010-01-05 01:33:22

这取决于您计划如何访问数据,其次取决于您计划如何存储数据。

如果要检查作为一个单元的组件的度量值,并且不打算按值进行搜索,那么使用数组也不是完全不可能的。另一方面,如果您稍后想知道哪些组件的宽度大于X值,那么使用数组会导致疼痛、脱发和宇宙热。

另一方面,如果要同时存储所有的值,那么使用数组可能是可以的。如果您要首先存储宽度,然后更新行以设置高度等等,性能会使您丧命,因为Postgres中的每个更新都需要真空清理。

我同意Roland的观点,你可能需要某种聚合。您可能也需要查看分区,以便可以截断(或删除)旧分区,而不需要删除旧数据所导致的清除死行的开销。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2003492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档