1

大企業向けの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

だからここに問題があります:

ドライバーテーブルからドライバーを削除すると、ロードリストテーブルの値がNULLに設定されるか、制約に基づいて行全体が削除されます。最初のケースでは、NULLに設定されている場合、誰かが特定の日付のすべてのレポートを一覧表示すると、そのIDがドライバーテーブルのどの行にもリンクされていないため、勤務中のドライバーの名前を確認できなくなります。秒の場合、行全体がロードリストテーブルから削除されると、システムは重要なデータを失います。

では、このような状況にどのように対処すればよいでしょうか。

4

2 に答える 2

4

推奨される方法(ただし、唯一の方法ではありません):

IsActiveドライバーまたは関連情報を実際に削除せずに、ドライバーを削除済みとしてマークします(ブール値の削除列があるか、それを呼び出します)。

このようにして、履歴を報告することができます。これに取り組む1つの方法は、テーブル上にビューを作成することです。AllDrivers用に1つ、ActiveDrivers用に1つ、テーブルではなくこれらに直接結合するか、クエリ句にIsActive述語を追加します。WHERE

于 2013-02-24T00:35:11.220 に答える
2

この状況に対処する方法は、Driverテーブルから行を削除しないことです。

これはあなたが保持したい情報です。したがって、削除しないでください。

必要になる可能性があるのは、ドライバー行を非アクティブ、アーカイブ済み、使用不可などとしてマークする方法です。削除ではなく、ステータスが変更されました。

そのドライバーを除外する必要があるクエリでは、述語(WHERE句の条件)を追加して、それらの行を除外できます。

于 2013-02-24T00:41:30.387 に答える