【问题标题】:Database design: Foreign keys dilemma数据库设计:外键困境
【发布时间】:2013-02-24 00:33:35
【问题描述】:

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

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

表 1:路线清单

roadlist (roadListNumber, vehicleId, driverId, date, start, end, fuel,...)
  • roadListNumber - 主键
  • 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 - 主键

表 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 表中删除整行,系统会丢失重要数据。

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

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      您可能需要一种方法来将驱动程序行标记为非活动、已归档、不可用或其他。您的状态发生了变化,而不是删除。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多