我有一个项目来建立一个网站,但它是复杂的,我有困难,找出建立数据库的最佳方式将是处理这些特殊的需求。
该网站是当地的建设者和农民(以及其他使用重型设备的人)之间租赁他们的机器。用户应该能够注册和列出一个项目的设备,然后是可搜索和可供其他用户的网站。
所以建筑商可能会注册并上传他的混凝土搅拌机的列表。然后,另一个用户可以搜索混凝土搅拌机租用之间的2个日期,并通过网站预订搅拌机。
到目前一切尚好。
问题是,建筑商应该能够设定一个违约日利率,但他们也应该能够说,贯穿7月份,或在8月的最后两个周末,搅拌机违约日利率是不同的。所以,基本上每天都会有不同的利率,我很难搞清楚什么是构建数据库最有效的方法,以及如何计算租用几天的总成本,如果每天都有不同的利率的话。
目前,我成像必须循环通过一个365大小的阵列,但这是不对的。我对这件事有点陌生,所以我可能只是有点困惑。
发布于 2013-05-30 08:32:57
除了您应该拥有的其他表(如设备、农民.)之外,您还可以使用以下方法:
equipment_price
---------------
equipment_id
equipment_name
equipment_default_price
equipment_special_price
-----------------------
equipment_id
special_price_interval_start
special_price_interval_end
equipment_special_price现在假设您有一个混凝土搅拌机,默认价格为每天100美元,但在8月的前2周,设备有不同的(特别)价格。
您对找到正确价格的查询(截至今天)如下:
SELECT
a.farmer_name,
b.equipment_name
CASE
WHEN d.equipment_special_price IS NULL THEN c.equipment_default_price
WHEN d.equipment_special_price > c.equipment_default_price THEN c.quipment_default_price
ELSE c.equipment_default_price
END AS equipment_price
FROM
farmers a,
LEFT JOIN equipments b ON b.equipment_farmer_id = a.farmer_id
LEFT JOIN equipment_price c ON c.equipment_id = b.equipment_id
LEFT OUTER JOIN equipment_special_price d ON d.equipment_id = b.equipment_id
WHERE
d.equipment_special_price = ( -- Usefull if you have multiple special prices, for the same equipment, in overlapping intervals
SELECT MAX(equipment_special_price)
FROM equipment_special_price
WHERE
special_price_interval_start >= NOW()
AND
special_price_interval_end <= NOW()
)发布于 2014-11-07 00:55:57
困难的部分似乎是定义模式的方式,使查询计算总成本是可管理的。其中的一部分是使用datediff()函数来确定间隔中的天数,以便它可以乘以该区间的每日价格。在这种方法中,我们需要一个查询,为租赁期内的每个间隔提供一个行,它的费率与以前的间隔不同,没有重叠,也没有空隙,涵盖整个租赁期间。然后,聚合函数可以与组一起使用,方法是将所有行折叠为一个行,以计算总价。
让我们假设一些应用程序逻辑确保在一个表中只指定一个速率作为设备的默认比率,而另一个表则确保为某一设备的任何期间只存储一个特殊价格。
Table equipment {
Id
Equipment
Rate // default rate
}
Table rate { // for special rates
Id
equipment_id // FK
start
end
rate // overrides default rate for the period
}
在http://explainextended.com/2009/07/01/overlapping-ranges-mysql/上可以找到一种有效的模式设计和查询方法,以查找租期内所有的特殊价格间隔。
将week_start和week_end替换为@rental_start和@rental_end。将event_table替换为上面的费率表。然后按照提供的方法,在租赁期内获得所有的特殊费率间隔。
使用SUM(DATEDIFF( rate.start,rate.end) * rate.rate)计算特殊费率天数的总成本。使用(datediff( @rental_start,@rental_end) - sum( datediff( rate.start,rate.end ))* equipment.rate计算默认费率总成本。把它们加在一起,得到总成本。
对不起,这不是一个完整的答案,但我希望它能让你走上正确的道路。
干杯!
https://dba.stackexchange.com/questions/43388
复制相似问题