我对表设计和性能有疑问。我有许多分析机器可以生成不同数量的数据(到目前为止,已经通过运行机器的dos程序存储在文本文件中)。我决定现代化并创建一个新的数据库来存储所有机器结果。
我创建了单独的表来按类型存储结果,例如平衡机的所有结果都存储在余额结果表等中。
我对每台机器都有一个通用的结果表格式,如下所示:
ClientRequestID PK
SampleNumber PK
MeasureDtTm
Operator
AnalyteName
UnitOfMeasure
Value
典型的ClientRequest可能有50个样本需要通过各种机器进行测试。每台机器每个样本只记录1行,因此每个表有50行与任何给定的ClientRequest相关联。
这适用于除一个以外的所有机器!
每个样品测量20-30个分析物(并且只在一个长行中吐出),而所有其他机器,我每个RequestID / SampleNumber只测量1个分析物。 如果我坚持这种格式,这台机器每年将生成超过miliion行,因为每个样本可以有多达30个测量。 我的其他表只会以每年3000-5000行的速度增长。
毕竟,我的问题是:
我最好坚持使用此表的通用格式,并且有多个行的存储区,或者更好的是只添加额外的列来表示每个分析符,这样每个样本只会生成1行(如其他表)。这台机器最多只能测量30个分析物(每台机器25万美元,我赢了;在我的一生中,它会得到另一个)。
我担心的是报告性能和在线编辑。在这两种情况下,PK:RequestID
和SampleNumber
保持不变,所以我想这只是一个加载更快的问题。我知道从设计的角度来看,多列方法被认为是可悲的,但在这种情况下会产生更好的性能吗?
BTW数据库是MS Jet / Access 2010
非常感谢任何帮助!
答案 0 :(得分:1)
如果行列数很少,则Jet / ACE数据库中的数百万行不会出现问题。
但是,我关心的是如何插入这些记录 - 这是实时数据收集吗?如果是这样,我建议这可能比Jet / ACE能够可靠地处理。
我是一位经验丰富的Access开发人员,他是Jet / ACE的忠实粉丝,但是根据我对你的项目的了解,如果我开始使用它,我肯定会选择一个服务器数据库,而不是因为Jet / ACE现在可能无法处理它,但是因为我正在考虑这个应用程序可能仍在使用的10年后(记住Y2K,这主要是设计的应用程序的问题)计划的过时,但从未被替换过。)
答案 1 :(得分:0)
您可以将AnalyteName列与“common results”表分离:
-- Table Common Results
ClientRequestID PK SampleNumber PK MeasureDtTm Operator UnitOfMeasure Value
-- Table Results Analyte
ClientRequestID PK SampleNumber PK AnalyteName
你加入了PK(Request + Sample。)这样你就不会不必要地复制所有剩下的行,可以避免在你不需要使用AnalyteName的查询中加入,可以支持额外的分析物,总体上更健全。除非你真的开始遇到性能问题,否则这就是我要遵循的方法。
哎呀,即使你开始遇到性能问题,我首先会转到一个真正的数据库,看看是否在将结果列添加到结果表之前修复了问题。