我正在使用PostgreSQL。
我知道PostgreSQL有数组数据类型。
http://www.postgresql.org/docs/8.1/interactive/arrays.html
目前,我需要使用数据库来存储半导体工厂的测量结果。
他们正在生产半成品。每个半导体单元都可以有可变数量的测量参数。
我计划用以下的方式设计这张桌子。
SemicondutorComponent
=====================
ID |
Measurement
=================
ID | Name | Value | SemicondutorComponent_ID数据示例:
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阵列设备?
SemicondutorComponent
=====================
ID | Array_of_measurement_name | Array_of_measurement_value发布于 2010-01-05 01:28:06
我不能评论数组与普通表的写入速度,但据我所知,使用2个数组的设计对于查询来说将非常麻烦。
我也不知道读取数组的性能,但从文档中可以看出,所有数组访问都是通过位置引用(索引)完成的,因此在后面查找特定的度量将是一个巨大的痛苦--您必须遍历名称数组来找到适当的索引,然后使用它来找到值。我怀疑它是否可以在纯SQL中完成,它可能需要一个用户定义的函数。
关于表的设计:您似乎关心的是写的速度。每天有2400万个组件,即每小时100万行,这并不多。在最坏的情况下,对于测量值,是每小时5100万行,所以每分钟不到100万行。我认为这应该是可行的,尽管应该对插入进行批处理,并避免在许多短暂的事务中执行许多行插入(最好将它们插入并以包的形式提交,比如10.000或100.000)。
我确实认为您还需要设计一个归档和/或聚合解决方案,因为继续插入这些卷似乎不太容易维护。我怀疑它也是有用的,但也许这只是我不理解这个数据库的目的。我的意思是,在我看来,你不太可能想要精确地确定一个组成部分的不可分割的测量,比如说,在它被制造一年之后。然而,保持像平均值、最小值、最大值和stddev测量值这样的统计数据似乎很有用。但也许你可以解释一下。
我想到的另一件事是,它可以帮助首先将原始测量数据存储在一个廉价而快速的日志中(仅仅是文本文件,比如CSV格式),然后使用多个读取器读取这些数据并将它们插入数据库。这些读者可以以一种相当稳定的方式运行。这将减少数据库的瓶颈,并使系统更加健壮(假设日志持续工作的可能性高于数据库崩溃的可能性)。当然,如果您需要从db实时报告来监视流程,这种方法就不太适合了(不过,在我看来,您需要在单独的组件级别上这样做似乎很奇怪)。
发布于 2010-01-05 01:33:22
这取决于您计划如何访问数据,其次取决于您计划如何存储数据。
如果要检查作为一个单元的组件的度量值,并且不打算按值进行搜索,那么使用数组也不是完全不可能的。另一方面,如果您稍后想知道哪些组件的宽度大于X值,那么使用数组会导致疼痛、脱发和宇宙热。
另一方面,如果要同时存储所有的值,那么使用数组可能是可以的。如果您要首先存储宽度,然后更新行以设置高度等等,性能会使您丧命,因为Postgres中的每个更新都需要真空清理。
我同意Roland的观点,你可能需要某种聚合。您可能也需要查看分区,以便可以截断(或删除)旧分区,而不需要删除旧数据所导致的清除死行的开销。
https://stackoverflow.com/questions/2003492
复制相似问题