添加字段以区分表的各个部分

时间:2018-04-02 11:36:49

标签: sql database sqlite database-design

我有几个gigabites的arducopter二元飞行日志。每个日志都是一系列消息。

MessageType1: param1, param2, param3
MessageType2: param3, param4, param5, param6
...

日志是自我描述的,因为第一次消息出现在日志中时它会告诉参数的名称是什么。

MessageType1: timestamp, a, b
MessageType1: value 1, value 2, value 3
MessageType2: timestamp, c, d, e
MessageType1: value 4, value 5, value 6
MessageType1: value 7, value 8, value 9
MessageType2: value 10, value 11, value 12, value 13

我编写了一个python脚本,它将日志分开并为sqlite数据库中的每种消息类型创建表,其中消息类型是表名,参数名是列名。

表MessageType1

| Flight Index | Timestamp |   a   |    b    |
|--------------|-----------|-------|---------|
| ...          |           |       |         |
| "Flight 1"   |       111 | 14725 | 10656.0 |
| "Flight 1"   |       112 | 57643 | 10674.0 |
| "Flight 1"   |       113 | 57157 | 13674.0 |
| ...          |           |       |         |
| "Flight 2"   |       111 | 56434 | 16543.7 |
| "Flight 2"   |       112 | 56434 | 16543.7 |

表MessageType2

| Flight Index | Timestamp |   c   |    d    |   e    |
|--------------|-----------|-------|---------|--------|
| ...          |           |       |         |        |
| "Flight 1"   |       111 | 14725 | 10656.0 | 462642 |
| "Flight 1"   |       112 | 57643 | 10674.0 | 426428 |
| "Flight 1"   |       113 | 57157 | 13674.0 | 642035 |
| ...          |           |       |         |        |
| "Flight 2"   |       111 | 56434 | 16543.7 | 365454 |
| "Flight 2"   |       112 | 56434 | 16543.7 | 754632 |
| ...          |           |       |         |        |

对于单个日志,这个数据库足够好,但我想添加几个日志。几个相同类型日志的含义消息将放入一个表中。

在这种情况下,我添加了一个专栏" Flight Index"这是我想要的,但是:

  • 处理的每个日志都应具有唯一标识符
  • 标识符的大小应该是最小的,因为我正在处理可能有数百万行的表。

我正在考虑将航班索引添加为整数,只是在处理日志时迭代该数字,并且如果数据库存在,则采用表的最后一行并使用其索引+ 1.这是最优还是存在SQL本机方式经营?

我一般做错了,因为我没有SQL经验吗?

编辑:添加了第二个表格,表明消息没有相同数量的参数和示例消息。

2 个答案:

答案 0 :(得分:1)

你可以用两张表来实现这个目标

表1

Flights 
Flight name, Flight number, date, device, etc. (any other data points make sense)
"Flight 1", 1, 1/1/2018,...
"Flight 2", 2, 1/2/2018,...

表2

Flight_log
Flight_number, timestamp, parameter1, parameter2,
1,111,14725,10656.0
1,112,57643,10674.0 
1,113,57157,13674.0 
...         
2,111,56434,16543.7 
2,112,56434,16543.7   

在加载Flight_logs表之前,你应该在Flights表中有一个条目,你可以进行"查找"从Flight表中获取Flight_number

答案 1 :(得分:0)

在阅读data normalization之后,我最终获得了以下数据库。

schema

这可以最大限度地减少表格数量。我可以为每个列完成35个表(每个消息一个)和正确的参数,但是如果消息中的参数发生更改,这将使数据库更加脆弱。

编辑:在datamodler修复后替换了图像。