我有一种情况,我希望以数据库格式存储大约1 TB的信息以支持查询。在数据库设计方面我没有经验,这也是我想问如何正确地做到这一点的部分原因。
我们有一个测试套件,可以为每个状态更新生成多组信息字段。每个州更新大约400个单独的64位信息字段,我们希望保留大约4亿个信息。问题是我们正在从大约1600台机器上接收信息更新。
一个有用的(对我们来说)数据库查询,格式为“我看过这个字段有值X,而早期有5个状态更新,同一个字段的值是Y吗?”
我最初的理解是在数据库中实现这一点,每个状态更新都按顺序存储(每台机器约250k个状态)。但是,这将生成1600个相同的表,每个表大约250k行。
是否有一些我还不了解的设计方法?我觉得拥有1600个表是一个理想的特性,因为这感觉就像查询可以并行运行的东西?
总结一下:鉴于多个相同的机器运行稍微不同的测试,并且我必须存储它们已经存在的最后250k - 1M状态滴答,我应该如何设计数据库?我目前的想法是每次测试创建一个表,其中每一行代表T,T + 1,T + 2等时的状态。
这是最佳的吗?还是有比这样设计更好的方法?我的查询需要多长时间才能获得每个约250k-1M条目的1500-3000个表(因为我想查询整个数据集?)我可以使用不同的方法获得更好的结果吗?
1500次测试,每个状态勾选存储400个64位变量。每次测试250k到1M状态滴答,我希望能够快速有效地存储和查询整个数据集。什么是最好的方法?
答案 0 :(得分:1)
我总是更喜欢单个表/集合,每个测试步骤都应该通过测试ID和步骤ID来识别。例如:
MySQL(非规范化)
步骤
id test step data
1 "Host_Test" "Step01" [serialized data]
MySQL(标准化(部分))
步骤
id test step
1 "Host_Test" "Step01"
stepdetails
step_id data_key data_value
1 "key" "value"
<强> MongoDB的强>
{
_id : "1",
test : "Host_Test",
step : "Step01",
data : {
key1 : value1,
key2 : value2
}
}
然后,您可以通过测试标识符识别每次测试的数据。
如果您在内存中进行测试,将数据存储到数据库/光盘将始终是您的主要弱点。写一个大桌子/收藏品不是主要观点。