数据库设计:外键困境

时间:2013-02-24 00:33:35

标签: mysql database database-design

我正在为一家大公司构建一个基于Web的应用程序,我对数据库部分有疑问。让我们首先向您介绍情况:

有4个表与外键连接:

表1:路线列表

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

所以这就是问题所在:

如果我从drivers表中删除驱动程序,则roadlists表中的值将设置为NULL,否则将根据约束删除整行。在第一种情况下如果某人列出了某个日期的所有报告,如果它被设置为NULL,他将无法看到值班的驱动程序名称,因为它的id不链接到drivers表中的任何行。在秒的情况下,如果整个行从路径列表中删除,系统将丢失重要数据。

那么我该如何应对这种情况?

2 个答案:

答案 0 :(得分:4)

首选方式(但不是唯一方式):

将驱动程序标记为已删除(具有布尔删除列,或将其命名为IsActive),而不实际删除驱动程序或相关信息。

这样你仍然可以在历史上报道。解决这个问题的一种方法是创建表格视图; AllDrivers的一个视图和ActiveDrivers的一个视图,并直接加入这些视图而不是表格,或者只是将IsActive谓词添加到查询WHERE子句中。

答案 1 :(得分:2)

处理这种情况的方法是不要删除Driver表中的行。

这是您要保留的信息。所以,不要删除它。

您可能需要的是一种将驱动程序行标记为非活动,已存档,不可用或其他任何方式的方法。你有状态变化,而不是删除。

任何需要该驱动程序的查询EXCLUDED,您可以添加谓词(WHERE子句中的条件)来排除这些行。