Php

數據庫結構——複雜的需求

  • January 9, 2015

我有一個建構網站的項目,但它很複雜,而且我無法確定建構數據庫的最佳方法是處理這些特定要求。

該網站供當地建築商和農民(以及使用重型設備的任何其他人)在他們自己之間租用他們的機器。使用者應該能夠註冊並列出設備項目,然後該站點的其他使用者可以搜尋和預訂。

因此,建築商可能會註冊並上傳他的混凝土攪拌機的清單。然後,另一個使用者可以在 2 個日期之間搜尋要租用的混凝土攪拌機,並通過該網站預訂攪拌機。

到目前為止,一切都很好。

問題是建造者應該能夠設置一個預設的每日費率,但他們也應該能夠說整個 7 月份,或者在 8 月的最後兩個週末,混合器的預設每日費率是不同的。因此,基本上每天可能最終都有不同的費率,我無法弄清楚建構數據庫的最有效方法是什麼,以及如果每天可能有不同的費率,如何計算租用幾天的總成本。

目前我正在想像必須循環通過一個 365 大小的陣列,但這不可能。我對此有點陌生,所以我可能只是感到困惑。

除了您應該擁有的其他表格(如設備、農民……)之外,您還可以使用以下方法:

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()
      )

有一個equipment包含的表,equipID, farmerID, defaultRate以及一個包含 的表rentRate``equipID, date, specialRate

然後該equipment表應該包含設備的正常資訊,並且您應該將所有例外情況寫入該rentRate表。

實際的使用者界面可能允許使用者選擇一個日期範圍,並且您可以通過循環插入到數據庫中(例如,如果您允許他們選擇特殊價格的開始日期和結束日期)。

查看費率時,數據庫會首先檢查是否有特殊的租金率rentRate,如果沒有,則列出預設費率。

引用自:https://dba.stackexchange.com/questions/43388