数据库设计:管理每日库存/容量的低开销解决方案?

时间:2011-03-23 14:45:16

标签: performance database-design web-applications saas

以下是场景:( MySQL 5.1 +,PHP,Apache)

我正计划一个SaaS应用程序,让CLIENTS访问SHOPS并预订TRIPS。 (所有大写都是实体)。商店提供TRIPS,但他们只有一定数量的员工来指导TRIPS(交易记录)。基本上,这是根据可用的员工数管理每个SHOP的日常容量的问题。什么是最佳的数据库设计解决方案,以最小的开销来提供此功能?

以下是数据库实体的简化视图:

table.clients  
client_id (pk, ai)  

table.shops  
shop_id (pk, ai)  

table.employees  
employee_id (pk, ai)  
shop_id (fk)

table.trips  
trip_id (pk, ai)  
client_id (fk)  
shop_id (fk)
trip_date (date)

情景1  当用户想要查看日历时,我可以针对每个请求对TRIPS运行查询,例如:

SELECT COUNT(*), 
trips.trip_date, 
trips.shop_id
FROM trips
WHERE shop_id=1
GROUP BY trips.trip_date, trips.shop_id

SCENARIO 2
创建一个每天存储信息的汇总表,但这个策略看起来很噩梦,有开销问题。例如,假设每个365天每年有1000家商店预订1000次旅行该表应存储未来2年(830天)的信息。看起来这将是1 /创建一个巨大的汇总表(830,000行),每年将被查询1,000,000次以上(1000个商店*每个商店1000次旅行)。当客户预订了TRIP时,它会增加号码(或者当旅行被取消时,号码会减少),这将有效地创建每日库存/容量。

所以,我的问题是:哪种方法最好?或者有更好的方法来实现这一目标吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

听起来很有趣!

首先 - 我知道你给了我们一个简化的架构版本,所以我认为其他地方还有很多,但你的“旅行”表看起来不对 - 如果商店只有一个客户,你就不会需要旅行表中的客户ID。

但是,您确实需要一个“booked_trips”表来记录哪个行程被预订到哪个员工 - 您也可以将其存储在“行程”表中,但通常预订还有许多其他内容,如发票,预订日期等,所以你可能想把这些东西分开。

我推荐像你的“选项1” - 使用查询来导出存储在规范化表中的数据,而不是选项2,这实际上是速度的非规范化。

值得在你的问题中定义“开销” - 几乎所有这些设计问题都需要交易时间和速度;如果你通过开销来表示磁盘空间,那么你会得到一个不同的答案,而不是你的意思是“运行我的查询的时间”。

一般来说,我的建议是采用规范化方法并衡量绩效;如果你知道自己有问题,只能非正规化。