2013-02-24 104 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