MySQL表设计可存储数百万个Great Circle路由距离

时间:2015-07-25 00:21:54

标签: database-design

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

(世界上大约有10,000个机场,但是其中只有大约2300个提供商业服务,这些是我主要考虑的问题.2300 x 2299 = 5,287,700行。如果我考虑实际的路线图,那么组合会少得多。航空公司,但这超出了我的工资等级!)

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

我想象一个简单的4列表,

AutoIncrementKeyID - AirportCode1 - AirportCode2 - CalculatedDistance

感谢您的任何想法或意见!

-Mike

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在进一步研究中,我了解到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