MySQL数据库设计来排序和过滤空中交通数据

Her*_*man 6 mysql database-design mysql-5.6

我正在努力为我正在尝试做的事情设计正确的数据库/结构。让我试着解释一下情况。

背景

我们是一群通过ADS-B接收监控空中交通的爱好者。如果您看过www.fr24.com,那么您对这一切都有一个很好的了解。所有飞机都会广播一个包含唯一 HEXCODE 标识符以及速度、位置等的信号。

我们接收信号的人将此信息存储在各种数据库中,所有这些都基于天空中的大鸟传输的 HEXCODE。根据您使用的硬件和软件,这决定了软件创建的数据库。

但是很多时候你看到一架“新”飞机并且数据库没有它的参考(先前数据),说它是什么型号或航空公司,所以它最终成为一个“未知”。每个人都试图从互联网上的各种不同来源更新未知数,因此当您下次看到它时,您会附上名称、型号和航空公司等信息。这仅供自己在本地计算机上查看。

这就是我正在忙的项目的背景。

数据

我们现在正在尝试将每个用户收集到的所有数据整合到一个数据库中,更新缺失的内容,在缺失的信息上互相帮助,并尝试使用最新的数据库。这就是现在变得困难的地方。

我设法获得了 6 个不同的数据集(不要称它们为数据库),每个数据集在许多不同的领域都有自己的数据。我已经剥离了 CSV/xls 文件以包含重要字段:(MODATE 是最后看到/修改的日期)

+---------+---------+-------+-------+------+-------+--------+----------+---------+
| HEXCODE | LASTHEX | REGNO | MODEL | TYPE | MODEL | SERIAL | OPERATOR | MODDATE |
+---------+---------+-------+-------+------+-------+--------+----------+---------+
Run Code Online (Sandbox Code Playgroud)

数据集 Bravo、Delta、Hotel、Sierra(让我们为它们命名)包含:

太棒了

+---------+-------+-------+------+-------+--------+----------+---------+
| LASTHEX | REGNO | MODEL | TYPE | MODEL | SERIAL | OPERATOR | MODDATE |
+---------+-------+-------+------+-------+--------+----------+---------+
Run Code Online (Sandbox Code Playgroud)

Charlie(就其包含的内容而言,这是最正确的来源):

+-------+-------+------+--------+----------+
| REGNO | MODEL | TYPE | SERIAL | OPERATOR |
+-------+-------+------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

Foxtrot(可用的最准确的 HEXCODE 到 REGNO 映射):

+---------+---------+-------+-------+------+-------+--------+----------+
| HEXCODE | LASTHEX | REGNO | MODEL | TYPE | MODEL | SERIAL | OPERATOR |
+---------+---------+-------+-------+------+-------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个数据库,命名为“aircraft1”,表名为:

  • 布拉沃
  • 查理
  • 三角洲
  • 狐步
  • 酒店
  • 塞拉

并且每个表都包含相同的字段:

+---------+---------+-------+-------+------+--------+----------+------------+
| hexcode | hexlast | regno | model | type | serial | operator | moddate    |
+---------+---------+-------+-------+------+--------+----------+------------+
Run Code Online (Sandbox Code Playgroud)

...尽管有些字段为 NULL(基于它来自的源,以及该源是否具有该数据。我将相关数据集导入到相关表中。

查询

现在,我可以用我有限的 SQL 语言向数据库询问任何问题:

select * from {table} where {regno/hex} = {whatever}
Run Code Online (Sandbox Code Playgroud)

...它提供了准确的信息(与不同的数据集相比)。

所有这一切的最终目的是组合所有数据并创建所有内容的当前和完整的数据库/数据集,其中选择将类似于:

  1. 从 BRAVO/DELTA/HOTEL/SIERRA
    检查 FOXTROT 中选择 HEXLAST,如果它是 HEXLAST 或 HEXCODE 以找到 REGNO,
    然后转到 CHARLIE 并拉入其他字段。
  2. 如果在 FOXTROT 中找不到 HEXLAST,请检查其他(数据集 B/D/H/S)是否有 REGNO,如果找到,请转到 CHARLIE 并拉入其他字段。
  3. 如果在 CHARLIE 中未找到,请检查其他(数据集 B/D/H/S)以获得最新的 MODDATE,并从该数据集中选择其他字段。
  4. 如果根本找不到匹配项,请将其列为 UNKNOWN 并带有 MODDATE(最后一次出现)
  5. 使用更新的信息创建一个新表。

问题

与同行交谈时,他们建议我根据数据源创建表是愚蠢的,我应该创建名为:hexcode、hexlast、regno 等的表。我还应该创建一个主键,它是一个唯一的数字到每条记录,而不是表本身内的主键(根据表中的数据,一些 PK 是 REGNO,其他的是 HEXLAST 等)。

基本上怀疑我到目前为止所做的事情,因为想知道我是否能够从所有这些中获得所需的输出。

你(以你的经验和专业知识)会如何处理这个问题?

到目前为止我所创造的东西,我非常愿意与任何愿意帮助这个项目的人分享。那里的信息基本上属于公共领域,因此它根本不是超级秘密/机密)。

我的强项在于个人电脑、网络和无线网络,而不是数据库。谷歌在很大程度上是有帮助的,但是当涉及到像这样的自定义/特定的东西时,找到正确的答案/解决方案/方法......那不是真的。

任何帮助和建议、指示和正确方向的掌声,将不胜感激。

Ric*_*mes 1

两个表具有相同的列集是“很少”的好形式。“通常”最好有一个带有额外列的表,该列指定行所属的“数据集”(Bravo/Delta/...)。

从“实体/关系”的角度考虑模式(表定义等)通常会很有帮助。从实体开始,例如(我猜)SignalsAircraft等。如有必要,请使用“多对多”关系表。想想学生:班级。实体包括学生、班级、教师等。Students_Classes 关系表表示每个学生所在的班级以及每个班级中有哪些学生。