以下是场景:( 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时,它会增加号码(或者当旅行被取消时,号码会减少),这将有效地创建每日库存/容量。
所以,我的问题是:哪种方法最好?或者有更好的方法来实现这一目标吗?
谢谢!
答案 0 :(得分:1)
听起来很有趣!
首先 - 我知道你给了我们一个简化的架构版本,所以我认为其他地方还有很多,但你的“旅行”表看起来不对 - 如果商店只有一个客户,你就不会需要旅行表中的客户ID。
但是,您确实需要一个“booked_trips”表来记录哪个行程被预订到哪个员工 - 您也可以将其存储在“行程”表中,但通常预订还有许多其他内容,如发票,预订日期等,所以你可能想把这些东西分开。
我推荐像你的“选项1” - 使用查询来导出存储在规范化表中的数据,而不是选项2,这实际上是速度的非规范化。
值得在你的问题中定义“开销” - 几乎所有这些设计问题都需要交易时间和速度;如果你通过开销来表示磁盘空间,那么你会得到一个不同的答案,而不是你的意思是“运行我的查询的时间”。
一般来说,我的建议是采用规范化方法并衡量绩效;如果你知道自己有问题,只能非正规化。