首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库结构.复杂的需求

数据库结构.复杂的需求
EN

Database Administration用户
提问于 2013-05-29 21:20:51
回答 2查看 275关注 0票数 1

我有一个项目来建立一个网站,但它是复杂的,我有困难,找出建立数据库的最佳方式将是处理这些特殊的需求。

该网站是当地的建设者和农民(以及其他使用重型设备的人)之间租赁他们的机器。用户应该能够注册和列出一个项目的设备,然后是可搜索和可供其他用户的网站。

所以建筑商可能会注册并上传他的混凝土搅拌机的列表。然后,另一个用户可以搜索混凝土搅拌机租用之间的2个日期,并通过网站预订搅拌机。

到目前一切尚好。

问题是,建筑商应该能够设定一个违约日利率,但他们也应该能够说,贯穿7月份,或在8月的最后两个周末,搅拌机违约日利率是不同的。所以,基本上每天都会有不同的利率,我很难搞清楚什么是构建数据库最有效的方法,以及如何计算租用几天的总成本,如果每天都有不同的利率的话。

目前,我成像必须循环通过一个365大小的阵列,但这是不对的。我对这件事有点陌生,所以我可能只是有点困惑。

EN

回答 2

Database Administration用户

发布于 2013-05-30 08:32:57

除了您应该拥有的其他表(如设备、农民.)之外,您还可以使用以下方法:

代码语言:javascript
复制
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周,设备有不同的(特别)价格。

您对找到正确价格的查询(截至今天)如下:

代码语言:javascript
复制
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()
       )
票数 1
EN

Database Administration用户

发布于 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计算默认费率总成本。把它们加在一起,得到总成本。

对不起,这不是一个完整的答案,但我希望它能让你走上正确的道路。

干杯!

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/43388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档