MySQL表设计用于存储数百万个大圆路线距离



我有一个包含所有商业机场记录的MySQL表。在这个表中,我有每个机场的经纬度。我计划使用一个c#类来预先计算许多(或所有)机场的大圆距离。

世界上大约有1万个机场,但只有2300个提供商业服务,这是我主要担心的。2300 x 2299 = 5,287,700行。如果我把航空公司的实际航线图考虑进去,组合就会少得多,但这远远超出了我的工资范围!)

我的问题是如何(有效地)设计存储距离的新表。我最初想到的是一个组合键,它将由一对机场代码组成,但在了解到组合键是顺序依赖的之后,我认为这种方法没有任何东西可以保存。

我设想了一个简单的4列表,

AutoIncrementKeyID - AirportCode1 - AirportCode2 - CalculatedDistance

感谢您的任何想法或输入!

迈克

添加代理键并不能解决顺序问题,也不能提高设计的效率。我建议您保留组合键,并添加检查约束以确保AirportCode1 <AirportCode2。这样,每一对机场在数据库中只能以一种方式表示。您可以创建视图和存储过程来支持使用无序参数进行查询和更新,或者仅处理应用程序中的顺序。>

在进一步的研究中,我了解到MySQL 5.5并没有真正实现'检查约束'。它会正确地解析它们,但在执行时忽略它们。

然而,许多人描述使用存储过程导致异常,因此事务停止。以下是我在检查了StackOverflow上的其他几个线程后编写的过程。

我对相应列的"NEW"预期值使用了STRCMP函数。

DROP TRIGGER IF EXISTS  `chk_bi` ;
CREATE DEFINER =  `mike`@`localhost` TRIGGER `chk_bi` BEFORE INSERT ON `Distance` 
FOR EACH ROW
BEGIN 
DECLARE msg VARCHAR( 255 ) ;
IF( STRCMP( NEW.dstnc_A, NEW.dstnc_B ) > -1 ) THEN SET msg = ('Unique Order
Constraint violated: Column A should always be less than Column B') ;
SIGNAL sqlstate '45000' SET message_text = msg;
END IF ;
END

最新更新