我有一个时间序列模拟模型,它有10个以上的输入变量。不同的模拟实例的数量将超过100万,每个模拟实例每天都会生成一些输出行。
为了将模拟结果保存在关系数据库中,我设计了这样的表。
创建表SimulationModel(
simul_id整数主键,
input0 string / numeric,
input1 string / numeric,
...)
创建表SimulationOutput(
dt DateTime主键,
simul_id整数主键,
output0 numeric,
...)
为了使每个模型都是独一无二的,我正在考虑以下几种方式。
对SimulationModel表的所有输入列设置唯一约束
重新设计SimulationModel表,将输入列分组为2~3列,并对这些分组列设置唯一约束。 (通过制作长字符串值,如“input0_input1_input2”)
忘记服务器端约束并在应用程序端执行该任务。
您如何看待这些选择?
在包含数百万行的超过10列上使用唯一索引是否没有问题?
还有其他方法可以推荐吗?
(我可以使用postgresql)
答案 0 :(得分:1)
如果您为simulationmodel创建两个表,如下所示:
Table SimulationModel {
id: integer,
...
}
Table SimulationModelInput {
simulationmodel_id: integer foreign key(SimulationModel.id),
input: string or numeric,
...
}
然后你可以在(simulationmodel_id,input)上放置一个约束,但获取配置的查询更复杂。
答案 1 :(得分:1)
唯一索引是确保每组输入都是唯一的方法。
答案 2 :(得分:1)
创建unqiue约束。 10列有几百万行并不是一个很大的表。此外,您的测试可能会因使用索引而受益 - 或者至少索引不会造成任何伤害。
答案 3 :(得分:1)
您可以创建一个“唯一”列,该列是其他列的哈希值,并将其称为标识。
答案 4 :(得分:1)
我将处理应用程序中的唯一性约束,特别是如果只有一个进程正在创建模拟。然后,您可以在常用筛选的输入列上拥有一个或多个非唯一索引,以便高效访问。