【问题标题】:Coordinates as primary key坐标作为主键
【发布时间】:2013-10-05 00:37:15
【问题描述】:

我有一个存储一些 POI 的表,所以它有一些 id、名称、纬度和经度。问题是,我不想在数据库中拥有相同坐标的 POI 两次。我想到的可能性是:

  • 将主键设置为纬度和经度的组合...但它们是浮点数,所以这不是一个好主意
  • 创建列 INT(16)(8 个纬度数字和 8 个经度数字合并在一起),但这就像复制数据一样,会占用大量空间
  • 对经纬度做一些hash,设置为主键,但怕是大数

怎么做,不会占用db太多空间?

【问题讨论】:

  • 1.为什么它们是浮动的? DECIMAL 不合适吗? 2. 我建议你将它们设为 DECIMAL 并在 (lat,lon) 上设置一个 UNIQUE KEY。除非您确定坐标永远不会“移动”,否则最好不要将它们用作 PK。
  • 如果您的坐标是浮点数据并且它们在之前的计算中有错误,这意味着理想情况下相等的坐标不相等,那么将它们转换为另一种形式或散列它们通常不会产生相等结果。您必须首先确定坐标是否指向同一点。为什么您认为您的浮点数据在同一点上可能没有相等的值?

标签: mysql sql floating-point coordinates


【解决方案1】:

经度和纬度都可以通过乘以 1e7(一千万)转换为 4 字节整数。 然后这是一个整数,提供您需要的所有精度 (3cm)。

现在将这两个 4 字节整数组合成一个 8 字节长。

我不确定数据库是否支持 long,可能是的。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2020-12-23
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多