【问题标题】:SQL Query and Database DesignSQL 查询和数据库设计
【发布时间】:2020-05-14 04:36:41
【问题描述】:

我正在为移动应用程序开发一个后端,使用 Laravel Lumen 和 MYSQL 作为按需交付服务的数据库,该应用程序的简单想法是用户创建一个取货请求(我有一个订单或多个订单,每个订单有自己的下车地点),司机应在地图上跟踪上车地点和下车地点。

最终我得到了包含取货省、取货地点、取货时间等的取货表和包含作为外键的取货 ID、下车省、下车地点和其他订单详细信息的订单表。

现在说得更清楚:

1 pickup may have 1 order within, 
1 pickup may have 5 orders within

我需要的是在 1 个查询中同时获取与司机特定省份相关的接送地点和下车地点,这可能吗?如果不是,解决这个问题的最佳数据库设计是什么。

任何帮助将不胜感激

【问题讨论】:

  • 大概一个订单有一个取货点和一个下车点?

标签: mysql sql database database-design


【解决方案1】:

假设每个订单都有一个且只有一个取货地点,我会将您的架构更改为有一个 locations 表。

locations
  id
  name
  address
  province
  ...etc...

orders
  id
  pickup_id references locations
  pickup_at
  dropoff_id references locations
  dropoff_at
  ...more info about the order...

您可能需要单独的接送表和下车表,每个表都引用位置,但重要的是要将位置标准化为单个表并引用它。

现在我们可以将订单与其位置关联起来。订单及其取货地点的基本查询是...

select ...
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ...
group by o.id;

我们可以使用它来查找在某个省份有取货或送货的订单。

select
  o.id,
  lp.name as pickup,
  lp.province as pickup_province,
  ld.name as dropoff,
  ld.province as dropoff_province
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ? in (lp.province, ld.province)
group by o.id;

某个位置的订单。

select o.id, lp.name as pickup, ld.name as dropoff
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ? in (lp.name, ld.name)
group by o.id;

订单完全在一个省内。

select o.id, ld.province as province
from orders o
join locations lp on o.pickup_id = lp.id
join locations ld on o.dropoff_id = ld.id
where lp.province = ld.province
group by o.id

还有更多。

dbfiddle

【讨论】:

  • @Schwen 感谢您的回复,但我的主要问题是用户取货可能有多个订单并且每个订单都有自己的省份和位置,在这种情况下我如何获得 1一个查询中的下车地点和多个下车地点,以便在地图上显示给司机
  • @AliAdil 抱歉,我不明白。你的意思是当一个送货员被分配了多个订单并且你想获得他们订单的所有取货和下车地点?能举个具体的例子吗?
  • @Schwen 有时提货的请求来自有多个客户订单的商店,所以在这种情况下,提货地点将是一个,交货地点会很多,但我认为你以前的设计会解决我还在尝试的问题
猜你喜欢
  • 2012-02-26
  • 2014-12-29
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多