Mar*_*tin 8 schema oracle database-design sql-server scalability
多个测试床生成各种复杂性的测量数据。
在最基本的形式中,不考虑任何元数据,测试台上的一次测量将是一个小的(1 - 几千个样本)时间序列,每个样本有几十个通道/信号/属性。
跨时间和测试台的测量将具有一组相似的信号,但并不总是与为测试设置添加和移除传感器相同。
目前我们估计我们的数据速率为 6 testbeds x 4 test per hour x 12 hours a day x 4000 samples per test == 1,152,000 samples per day x 365 == 420,480,000 samples per year
_ x 48 columns per sample (currently 32 bit floats, mostly) ~~~ 75 GB per year
(本例中的列指的是通道/信号)
如果/当添加更多测试平台时,数据量可能会相应增加。
测试台在本地生成数据,然后将数据异步导入数据库。(可能在一秒钟内生成几千个样本,然后在本地进行审查,然后进行刮擦或导入。)
我们希望查询主要针对单个测量的聚合。即,您希望找到所有测量值(每个测量值都有 4k 个样本),例如 channel_output_voltage 的平均值在某个范围内。
为此设置表格的好方法是什么?必须考虑哪些因素?
从理论上讲,每次测量我可以使用一张桌子,每年生成 100,000 张桌子,但这对我来说并不是一个好主意。
或者我可以将所有内容都放在一个大表中(有数百列),该表为所有通道留出空间,并根据需要添加通道:每个样本一行。未使用的通道保持 NULL。
MEASUREMENTS
------------
measurement_id } PK
time_stamp }
channel_1 (may be NULL for a certain measurement_id ...)
channel_2
...
channel_n(+1)
Run Code Online (Sandbox Code Playgroud)
或者我可以采用一种方法,即为样本(时间戳)设置一个表,一个包含所有值的表:(MEASUREMENTS 表中每个样本一行,SAMPLE_VALUES 表中每个样本 n 行)
SAMPLES SAMPLE_VALUES
------------ -------------
measurement_id sample_id
time_stamp channel_id (links to a channels table where there is a name etc.)
sample_id channel_value
Run Code Online (Sandbox Code Playgroud)
还有哪些其他选择?如何进一步调查我们应该选择哪个选项?
由于客户的限制,我们想把它放在 MS SQLS 或 Oracle 中。
从一个答案:
不要存储原始数据,只存储聚合。严重地。
这假设有一种有意义的方法可以事先确定客户想要针对他们的数据运行哪些查询。没办法:-)
我们预计查询主要针对单个测量值的聚合。好吧,利用这一点。不存储原始数据,仅存储聚合数据。严重地。
好的,您需要调试聚合代码。因此,将原始数据以一些简单的共振峰(csv?)形式保存在磁盘文件中。计划几天后扔掉它们。
这将消除您的 75GB/年要求、20 INSERT/秒要求等。
每年 100,000 张桌子 坏主意。每当你打开一个表时,操作系统就会发出警告。我已经看到它完成了,但是打开一张桌子需要几秒钟到几分钟的时间。