首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >地图上两种不同类型元素的数据库模式

问地图上两种不同类型元素的数据库模式
EN

Software Engineering用户
提问于 2021-05-29 08:40:12
回答 1查看 58关注 0票数 0

我为一个客户编写了一个在地图上显示客户的软件(Google )。我将客户机存储在MySQL数据库(表clients)的表上,并使用标记在地图上显示它们。每个客户端都有一个id、name、lat、lon和其他卫星字段。客户希望添加一个功能来向地图添加注释。我做了第二张桌子(notes)。每个音符都有一个id,text和lat,lon。

应用程序现在发出两个请求来填充映射,一个请求获取客户端,另一个请求获取注释。它工作得很好,但现在我正在努力实现地图上的“附近搜索”搜索。在备注之前,我可以简单地对客户端进行MySQL查询,按距离从地图上的给定点对它们进行排序。现在我应该提出两个查询,但是客户机和注释可以交织在一起:

例如:

  • client12 -200米
  • client8 -2公里
  • note10 -5公里
  • note3 -8公里
  • client1 -12公里

由于我在MySQL查询中使用限制/偏移量来限制每次调用返回的项(如果用户向下滚动列表,则使用不同的偏移量重申调用),所以我不知道将这两种类型的项组合在一起的最佳方法是什么。

在这里,我可以想到一些选择:

  • 在数据库查询之后在软件中进行交互(听起来是个坏主意。还必须放弃查询的限制/偏移部分)
  • 删除clients和notes表,并使用单个item表。Notes现在有很多空字段,因为客户端有许多与注释无关的非常特定的字段。
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2021-05-29 11:30:54

用于lat和notes的clients和D3字段似乎代表跨多个表重复的相同列,这违反了干原理,因此应该将这些列合并为单个表(item?)。

但是,clients表和notes表仍然需要(没有各自的lat/long字段,这些字段位于单独的item表中)才能保持第三范式(3NF)。也就是说,您应该避免通过使用clients或notes将那些仅对NULL或D12有意义的字段合并到一个表中,因为这意味着非键属性之间的依赖关系,这违反了3NF。

推荐阅读SO:https://stackoverflow.com/questions/723998/what-are-database-normal-forms-and-can-you-give-examples

Update:只是为了澄清-- item表将包含clients和notes的lat和lon字段,因此按距离排序的距离查询只需要关心单个表。

另外两个表clients和notes仅用于选择特定于这些实体的其他字段;因此,例如,如果距离查询还需要包括[clients].[name]和[notes].[text],则查询可以包括一个LEFT JOIN,以便在适用的情况下提取这些字段--例如:

代码语言:javascript
复制
SELECT i.id, i.lat, i.long, c.name, n.text
FROM item i
LEFT JOIN clients c ON c.itemId == i.id
LEFT JOIN notes n ON n.itemId == i.id

ORDER BY ...

当然,左联接意味着查询结果将包含NULL字段,这取决于条目是连接到clients还是notes条目,但这通常不是问题,因为这些字段在底层数据库中不会有任何非键依赖项。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/426827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档