我有一个MySQL表,其中包含所有商业机场的记录。在该表中,我有每个机场的纬度和经度。我计划使用C#类为许多(或所有)机场预先计算大圆距离。
(世界上大约有10,000个机场,但是其中只有大约2300个提供商业服务,这些是我主要考虑的问题.2300 x 2299 = 5,287,700行。如果我考虑实际的路线图,那么组合会少得多。航空公司,但这超出了我的工资等级!)
我的问题是如何(有效地)设计将存储距离的新表格。我最初想的是一个复合键,它将由一对机场代码组成,但在得知复合键依赖于顺序后,我不认为该方法可以保存任何东西。
我想象一个简单的4列表,
AutoIncrementKeyID - AirportCode1 - AirportCode2 - CalculatedDistance
感谢您的任何想法或意见!
-Mike
答案 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