小编Rak*_*h B的帖子

单独的地址表、纬度、经度

我们正在为功能有限的社交网络应用程序设计数据库。用户(注册用户)、零售店等是我们需要存储的几个实体。我们需要存储每个实体的地址。我们还需要存储注册用户、零售店等的纬度和经度。

最初我们设计了如下所示的表格。我们创建了一个单独的地址表,因为用户、零售店和其他实体的地址格式相同。

User(UserID, UserName, AddressID)
RetailOutlet(RetailOutletID, OutletName, AddressID)
Address(AddressID, CityID, AddressLine1, AddressLine2, Latitude, Longitude)
Run Code Online (Sandbox Code Playgroud)

现在我们意识到我们需要搜索靠近用户当前位置(CurrentLatitude,CurrentLongitude)的零售店,所以我们需要运行一个查询,如

SELECT OutletName 
from RetaileOutlet 
INNER JOIN Address ON RetailOutlet.AddressID = Address.AddressId 
WHERE Address.Latitude BETWEEN CurrentLatitude - 10 and CurrentLatitude + 10 and
      Address.Longitude BETWEEN CurrentLongitude - 10 and CurrentLongitude + 10
Run Code Online (Sandbox Code Playgroud)

现在我们认为上面的查询会运行缓慢,因为用户数量将远远超过零售店数量。从数据库设计/性能的角度来看,应该完成以下哪一项。

  1. 在 Address 表中的 Latitude、Longitude 和 RetailOutlet 表中的 AddressID 上创建索引。所以表结构不会发生变化。

  2. 将纬度、经度从地址表移动到零售店和用户表。还要在 RetailOutlet 表中的纬度、经度上创建索引。所以表结构如下所示。

    User(UserID, UserName, AddressID, Latitude, Longitude)
    RetailOutlet(RetailOutletID, OutletName, AddressID, Latitude, Longitude)
    Address(AddressID, CityID, AddressLine1, AddressLine2)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如下所示更改表结构,并在 UserAddress 表中的 Lat、Lng 和 User 表中的 …

performance database-design address query-performance

5
推荐指数
1
解决办法
1679
查看次数