有关数据库设计的一个初学者的新问题。
我有一个管理一些记录器数据的应用程序,例如。对时间,电压,电流,温度的1000次顺序测量。此外,每个序列运行都具有元数据(日期,位置等)。
因此,我需要为每组度量提供一个表,并为一个主表列出这些表以及每个表的元数据。
几个问题:
这并没有真正使用所有数据表都是相同格式的事实-没有“表数组”的概念,这意味着什么吗?
我只是给每个数据表一个唯一的名称,将其作为主列放在表中,然后将其替换为SQL select语句-还是有更好的方法?
编辑:许多表的原因,每个运行一次,是因为可能有10-100个运行,每个运行有数千次测量。如果我只想显示/查询/删除一次,将每个表都放在自己的表中似乎更自然。
看起来这是程序员的思维方式(一切都应该是独立对象的集合),数据库方法似乎更喜欢-将所有内容存储在一起并使用索引/交叉引用。
最佳答案
顺便说一句,我想解决一个问题,即管理一个表中的所有数据与拥有多个表是否比较麻烦。
开始的假设:您将至少要有一个元数据表来存储实验元数据,以及一个或多个表来存储测量值。
如果采用“我希望每个测量集都有一个表”方法,则需要知道表的名称。因此,您的元数据表如下所示:
Metadata
----------
experimentName
experimentLocation
experimentDateTime
...
measurementTableName
还有每个实验的表格,每个表格看起来都一样:
Measurement0001 Measurement0002 Measurement0003 Measurementt0004
-------------- -------------- -------------- --------------
measurementNum measurementNum measurementNum measurementNum
voltage voltage voltage voltage
amps amps amps amps
然后,在程序中,首先需要获取元数据:
select * from Metadata where experimentName='Johnson Controls 1'
除其他事项外,该方法将返回感兴趣的实验的MeasurementTableName(例如Measurement0002)。然后,您的下一个查询是:
select * from Measurement0002 order by measurementNum
现在,让我们采用“将所有数据存储在测量表中”的方法。您的元数据表如下所示:
Metadata
----------
experimentName
experimentLocation
experimentDateTime
...
measurementSetID
并提供所有实验的表格。
Measurement
--------------
measurementSetID
measurementNum
voltage
amps
然后,像以前一样,您首先需要获取元数据:
select * from Metadata where experimentName='Johnson Controls 1'
除其他事项外,它会为您提供measurementSetID,您将用它来仅获取所需集合中的度量值(假设id = 2)。然后,您的下一个查询是:
select * from Measurement where measurementSetID=2 order by measurementNum
因此,让我们比较一下这两种方法...元数据查询本质上是相同的。唯一的区别是,在第一种情况下,您正在检索所需实验表的measurementTableName。而在第二种情况下,您正在为测量表中的所需条目检索measurementSetId。
获取度量的查询也基本相同:
select * from Measurement0002 order by measurementNum
select * from Measurement where measurementSetID=2 order by measurementNum
唯一的变量是表名称或measurementSetID:
select * from <tablename> order by measurementNum
select * from Measurement where measurementSetID=<setID> order by measurementNum
查询结果几乎是相同的,第二种方法只是在数据中给您额外的一列(measurementSetID),您可以忽略该列,因为所有返回的行将具有相同的集合ID。