数据库为fileformat

时间:2009-02-04 17:10:13

标签: database database-design sqlite

关于数据库设计的niave初学者问题 我有一个管理一些记录器数据的应用程序,例如。 1000s的时间,电压,电流,温度的连续测量。此外,每个序列运行都有元数据(日期,位置等) 所以我需要一组用于每组测量的表和一个列出这些表的主表以及每个表的元数据。

几个问题:
这并没有真正使用所有数据表都是相同格式的事实 - 没有'数组表'概念,这是否意味着什么?

我是否只为每个数据表赋予一个唯一的名称,将其作为列放在主表中,然后将其替换为SQL select语句 - 或者是否有更好的方法?

编辑:许多表的原因,每次运行一次,可能有10-100次运行,每次运行有1000次测量。如果我想显示/查询/删除一次运行,那么将它们放在自己的表中似乎更自然 看起来这是程序员心态(一切都应该是单独对象的集合),数据库方法似乎更喜欢 - 将所有内容存储在一起并使用索引/交叉引用。

8 个答案:

答案 0 :(得分:7)

你有一个表(Run)存储日期/时间/位置和一个整数主键(自动增量)。

你有另一个表(Measurements)存储时间/电压/电流/ temp,一个整数主键(自动增量)和一个FK to Run(只是一个名为RunID的非空整数列)。

总共2个表。

答案 1 :(得分:2)

您提出的问题是假设您需要的表格超过两个表,目前为止所有答案都建议您创建。

然而,您说这是一个关于数据库设计的问题,正确的设计确实使用了这两个表。如果绝对必要,您可以稍后对数据进行分区,并且很可能一旦超过那些 n x 100运行x m x 1000 测量值。

带有运行的表将没有很多行。具有测量数据的表将具有许多行,但是使用引用表的键,您可以创建将加速数据库操作的索引。您的应用程序设计将更容易OTOH。

答案 2 :(得分:2)

我会做以下事情(感谢格兰特的桌面设计):

+-------------------+     +----------------------+
|    Sequence       |     | Measurements         |     +------------------+
+-------------------+     +----------------------+     | Measurement Type |
|  metaID (pri Key) |---->| metaID               |     +------------------+
|  location         |     | typeID               |---->| typeID (pri Key) |
|  other metadata   |     | measureID   (pri Key)|     | typeName         |
+-------------------+     | value                |     | typeUnits        |
                          +----------------------+     +------------------+

所以类型表会有:

typeID      typeName     typeUnits
0           Volts        V
1           Current      A

测量表每次测量都有一行。

因此,一个序列行将与几个测量行相关联,每个测量行将指定它的测量类型。

这将使您能够轻松地使用伏特和电流进行一次测试运行,并使用volts1,volts2,current,resistance进行另一次测试运行,而无需更改表格及其随附的所有查询。

  

许多表的原因,每个表一个   跑,是可能有10-100   每个运行1000多个   测量。如果我想   显示/查询/删除只运行一次   似乎更容易让每个人都拥有它   表

嗯,实际上并不容易,因为在某些时候你必须决定要查看哪个表并将该表名放入SQL语句中。将它们全部放在一个表中也很容易,而不是将表名放入SQL请求中,而是将序列名称作为WHERE sequence =“sequencenumber”。这很简单,即使有数千个条目也不应该慢。在某些SQL服务器中,您也可以创建视图,这有点像“假”表。它看起来像一个表,但它实际上是一个嵌入式SQL语句 - 如果你愿意,你可以为每个序列创建一个新视图,然后你可以像操作它们自己的表一样操作它们。

然而 -
你去哪个方向并不重要。如果您对每个序列的表感到满意,请继续执行。它只是一个数据库,如果/当你达到理解并需要更复杂的布局时,将现有数据库转换为更灵活的新布局并不困难。

现在让它变得简单,并且随着您的学习,您可以根据需要进行调整。

- 亚当

答案 3 :(得分:2)

顺便说一下,我想解决一个表中管理所有数据是否痛苦的问题,而不是有多个表。

开始假设:您将希望至少有一个元数据表来存储实验元数据,以及一个或多个表来存储测量结果。

如果你采用“我想要每个测量集的表”方法,你需要知道表的名称。因此,您的元数据表将类似于:

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。

答案 4 :(得分:0)

如果单次测量具有所有值(时间,电压,电流,温度),那么您将在一个表中为每个值使用一个字段。

如果它们不相关,那么最好简单地使用值和值类型指示符(1 =电压,2 =当前等)。

如果相关,并且您想要处理元数据,则可能需要具有通用元数据字段和元数据类型字段,具体取决于元数据的性质。

为了论证,我们假设您的元数据就是位置。您需要设置位置表,然后将相应的locationID放在元数据字段中。 (如果你输入locationId,请确保INT中的类型,以便稍后可以加入表格)

您通常会使用查找表作为类型指示符,并使用视图通过加入这些字段来创建端口。

答案 5 :(得分:0)

如果我理解你的问题,我可能会使用两张表。

'TestInfo'。每条记录都包含运行测试的日期等。这是您的元数据。另外,我会添加一个生成的'RunId',这是一个唯一的数字。

'RunInfo'每个记录包含runId,以及当前,温度,时间等信息。

RunId将数据绑定回适当的测试运行,您不必创建一堆表。此外,您可以在任何测试中对runinfo进行查询。

现在 - 根据您的使用情况,这可能不太理想,但它是一个很好的起点。

答案 6 :(得分:0)

我要做的是在元数据表中有一个唯一的ID(自动递增),并使用该ID将测量和元数据组合在一起。

+-------------------+     +----------------------+
|    Meta Data      |     | Measurements         |
+-------------------+     +----------------------+
|  metaID (pri Key) |---->| metaID <-(index this)| 
|  location         |     | measureID   (pri Key)|
|  metaDate         |     | voltage              |
+-------------------+     | amperes              |
                          | current              |
                          +----------------------+

你有一堆具有相同metaID的测量记录(但他们有自己的id),他们每个都会匹配元数据。

答案 7 :(得分:0)

一般来说,双表方法似乎最适合您的应用。

为确保良好的性能,请确保在表上创建索引。例如,以Grant的模式为例,您需要一个Measurements表上的索引,键入metaID(主键)和measurementID(二级键)。

每个实验集的几千次测量并不是很多数据 - 所以使用正确的索引和正确编写的查询,您的数据库实际上只会读取所需实验的数据行的磁盘。

由于您可能会同时从一个实验中加载包含实验数据的表格,因此相关数据的位置已经很高 - 因此您无法将数据分成单独的表格。“ p>

最后,您可能想要了解创建表视图 - 这将使您能够创建虚拟表,每个视图仅表示来自一个实验的数据。您可以按需创建视图,然后在完成后删除视图。