我正在为一家大公司构建一个基于Web的应用程序,我对数据库部分有疑问。让我们首先向您介绍情况:
有4个表与外键连接:
表1:路线列表
roadlist (roadListNumber, vehicleId, driverId, date, start, end, fuel,...)
表2:驱动程序
drivers(driverId, firstName, middleName, lastName, and so on...)
表3:车辆
vehicles(vehicleId, group, type, model, gpsDevice, and so on...)
表4:cargo_zones
cargo_zones(zoneId, name, permiter, area, latitures, longtitudes, and so on...)
表5:roadLists_cargoZones_mapping
roadLists_cargoZones_mapping(roadListNumber, zoneId, spentFuel, tkm, mcm,...)
所以这就是问题所在:
如果我从drivers表中删除驱动程序,则roadlists表中的值将设置为NULL,否则将根据约束删除整行。在第一种情况下如果某人列出了某个日期的所有报告,如果它被设置为NULL,他将无法看到值班的驱动程序名称,因为它的id不链接到drivers表中的任何行。在秒的情况下,如果整个行从路径列表中删除,系统将丢失重要数据。
那么我该如何应对这种情况?
答案 0 :(得分:4)
首选方式(但不是唯一方式):
将驱动程序标记为已删除(具有布尔删除列,或将其命名为IsActive
),而不实际删除驱动程序或相关信息。
这样你仍然可以在历史上报道。解决这个问题的一种方法是创建表格视图; AllDrivers的一个视图和ActiveDrivers的一个视图,并直接加入这些视图而不是表格,或者只是将IsActive
谓词添加到查询WHERE
子句中。
答案 1 :(得分:2)
处理这种情况的方法是不要删除Driver表中的行。
这是您要保留的信息。所以,不要删除它。
您可能需要的是一种将驱动程序行标记为非活动,已存档,不可用或其他任何方式的方法。你有状态变化,而不是删除。
任何需要该驱动程序的查询EXCLUDED,您可以添加谓词(WHERE子句中的条件)来排除这些行。