如何删除/匿名化敏感数据并保持其完整性?

How delete/anonymize sensitive data and keep its integrity?

提问人:Aleks V 提问时间:5/22/2023 最后编辑:Neocoder_1Aleks V 更新时间:5/22/2023 访问量:78

问:

我正在开发 Calcometer,这是一款帮助医护人员(和销售人员)跟踪他们在预约之间开车的距离和时间的应用程序。

技术栈:Ruby on Rails、StimulusJS 和 Bootstrap。

目标

在删除患者数据方面符合 GDPR,同时不破坏主应用逻辑


描述

模型 (5):地址、预约、患者、旅行、用户。图式

create_table "addresses", force: :cascade do |t|
    t.string "street"
    t.string "number"
    t.string "zip_code"
    t.string "city"
    t.string "state"
    t.string "country"
    t.float "latitude"
    t.float "longitude"
    [...]
  end

  create_table "appointments", force: :cascade do |t|
    t.datetime "start_time"
    t.datetime "end_time"
    t.bigint "user_id"
    t.bigint "patient_id"
    [...]
  end

  create_table "patients", force: :cascade do |t|
    t.string "name"
    t.bigint "client_id", null: false
    t.bigint "address_id", null: false
    [...]
  end

  create_table "trips", force: :cascade do |t|
    t.bigint "start_appointment_id", null: false
    t.bigint "end_appointment_id", null: false
    t.float "driving_distance"
    t.integer "driving_time"
    [...]
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "name"
    t.string "last_name"
    [...]
  end

用户流

  1. 用户创建患者并输入其地址。
  2. 用户为他们在current_day期间遇到的所有患者创建 n 个约会。
  3. 应用程序根据start_appointment和end_appointment计算行程(每当current_day中存在 >2 个约会时) 3a. 在行程模型中,对 start_appointment 和 end_appointment进行了验证,以避免重叠。 3b. 在任命模型中,start_time和end_time被验证(后者必须在第一个之后)。
  4. 每天凌晨 1 点触发recalculate_trip服务,以重新计算前一天的行程,以实现数据完整性。 4一个。删除约会将触发同一天的服务
  5. [在制品]用户可以为其客户/雇主导出(通过电子邮件发送)给定时间范围内的行程数据。

主要方法

使用地理编码器计算行驶距离的方法

def calculate_driving_distance
   coordinates1 = start_appointment.patient.address.latitude, start_appointment.patient.address.longitude
   coordinates2 = end_appointment.patient.address.latitude, end_appointment.patient.address.longitude
   Geocoder::Calculations.distance_between(coordinates1, coordinates2) if coordinates1 && coordinates2
end

根据瑞士driving_distance和平均速度(50 km/h)计算行驶时间的方法

def calculate_driving_time
   (calculate_driving_distance.to_f / AVERAGE_SPEED \* 60).round if calculate_driving_distance  
end

问题

#1 删除患者帐户时的数据完整性

患者数据是姓名、last_name和address_id;由于这是敏感数据,我想确保该应用程序符合 GDPR,因此每当用户想要删除患者数据时,它都会被删除/匿名化。

#2 更新方法calculate_driving_distance

目前,每当删除患者时,这将导致 distance_calculation 方法出现问题,因为坐标是通过预约从患者那里获取的(coordinates1 = start_appointment.patient.address.latitude);因此,当患者被删除时,患者将变为 NIL,不再有坐标 🤷

我已经检查了这个(旧)答案,但是它似乎已经过时了(9 +哟),我想知道数据库设计的最新最佳实践。

对于问题 1,我考虑了这两个相互排斥的选项:

建议的解决方案 A:使用 paper_trail gem 实现软删除解决方案

建议的解决方案 B:永久删除患者数据。

对于问题 2,我还考虑了以下两个选项:

建议的解决方案 C:实现软删除,永远不会出现此问题

建议的解决方案 D:每当创建约会时,设置 address_id = patient.address_id;并更新了坐标获取

coordinates1 = start_appointment.patient.address.latitude

coordinates1 = start_appointment.address.latitude

感谢您到目前为止的阅读,我很高兴阅读您提出的解决方案和反馈。

ruby-on-rails ruby 数据库 paper-trail-gem

评论

4赞 Dave Newton 5/22/2023
“最佳实践”是固执己见的。地址 ID 不是敏感数据,地址是。一旦患者被“删除”,您还需要计算距离吗?如果是这样,您要么不需要删除地址(可能不合规,但我不记得了),要么在约会时计算距离并存储在约会中(似乎最好),因为距离不敏感,并且不需要删除约会。
4赞 Stefan 5/22/2023
如果患者搬迁并更新地址,则会出现同样的问题。您应该将跟踪预约所需的数据与患者的当前地址数据分离。
0赞 Aleks V 5/23/2023
@DaveNewton:一旦患者被“删除”,我就不需要计算距离,因为计算应该在之前完成。但是,距离存储在行程中,约会仅用作行程的开始和结束地址。
0赞 Dave Newton 5/23/2023
那么具体问题是什么呢?如果距离存储在行程中,那么一旦患者的数据被软删除/匿名化,为什么还需要重新计算它?如果你有 fkey refs,那么硬删除并不是一个真正的选择(它很少具有任何复杂的数据模型,真的),标志 + 匿名处理该问题并且符合 GDPR(据我所知)。

答: 暂无答案