SQL查询和数据库设计

时间:2020-01-28 17:36:40

标签: mysql sql database database-design

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

最终,我最终得到包含取件省份,取件位置,取件时间等的取件表,以及包含取件ID作为外键,取件省份,取件位置以及其他订单详细信息的订单表。

现在让它变得更加清晰:

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

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

假设每个订单只有一个提货和下车地点,我将更改您的架构以具有一个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

还有更多

collections.defaultdict