2013-02-24 88 views
1

我正在爲一家大公司構建一個基於Web的應用程序,我對數據庫部分有疑問。讓我們首先爲您介紹的情況:數據庫設計:外鍵困境

但是也有一些與外鍵連接的4個極表:

表1:roadlists

roadlist (roadListNumber, vehicleId, driverId, date, start, end, fuel,...) 
  • roadListNumber - PrimaryKey的
  • vehicleId - foreignKey
  • driverId - foreignKey

表2:驅動

drivers(driverId, firstName, middleName, lastName, and so on...) 
  • driverId - 的PrimaryKey

表3:車輛

vehicles(vehicleId, group, type, model, gpsDevice, and so on...) 
  • vehicleId - 的PrimaryKey

表4:cargo_zones

cargo_zones(zoneId, name, permiter, area, latitures, longtitudes, and so on...) 
  • 了zoneid - 的PrimaryKey

表5:roadLists_cargoZones_mapping

roadLists_cargoZones_mapping(roadListNumber, zoneId, spentFuel, tkm, mcm,...) 
  • roadListNumber - FOREIGNKEY

所以這裏的問題是:

如果我刪除驅動程序表中roadlists表中的值將被設置爲NULL或整排將是一個駕駛根據約束刪除。在第一種情況下,如果某人在某個日期列出所有報告時將它設置爲NULL,他將無法查看值班人員的姓名,因爲其ID不鏈接到驅動程序表中的任何行。在秒數情況下,如果整個行從道路列表表中刪除,則系統丟失重要數據。

那麼我該如何處理這種情況呢?

回答

4

的首選方法(但不是唯一的方法):

標記爲刪除的驅動程序(有一個布爾刪除列,或稱之爲IsActive),實際上並沒有刪除驅動程序或相關信息。

這樣你仍然可以歷史報告。解決這個問題的一種方法是在表格上創建視圖;一個用於AllDrivers的視圖,另一個用於ActiveDrivers並直接加入到這些表中,或者直接將IsActive謂詞添加到您的查詢WHERE子句中。

2

您處理這種情況的方式是不要從驅動程序表中刪除行。

這是您要保留的信息。所以,不要刪除它。

您可能需要的是將驅動程序行標記爲非活動狀態,存檔狀態,不可用狀態或其他方式。你有狀態改變,不是刪除。

如果您需要驅動程序EXCLUDED,您可以添加一個謂詞(WHERE子句中的一個條件)來排除這些行。

+0

+1。從我.... – 2013-02-24 00:51:16