1

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

有 4 个表是用外键连接的:

表 1:路线清单

roadlist (roadListNumber, vehicleId, driverId, date, start, end, fuel,...)
  • roadListNumber - 主键
  • 车辆 ID - 外键
  • driverId - foreignKey

表 2:驱动程序

drivers(driverId, firstName, middleName, lastName, and so on...)
  • driverId - 主键

表 3:车辆

vehicles(vehicleId, group, type, model, gpsDevice, and so on...)
  • 车辆 ID - 主键

表 4:cargo_zones

cargo_zones(zoneId, name, permiter, area, latitures, longtitudes, and so on...)
  • zoneId - 主键

表 5:roadLists_cargoZones_mapping

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

所以这里是问题:

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

那么我该如何处理这种情况呢?

4

2 回答 2

4

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

将驱动程序标记为已删除(有一个布尔删除列,或称为它IsActive),而不实际删除驱动程序或相关信息。

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

于 2013-02-24T00:35:11.220 回答
2

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

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

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

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

于 2013-02-24T00:41:30.387 回答