提问人:Aleks V 提问时间:5/22/2023 最后编辑:Neocoder_1Aleks V 更新时间:5/22/2023 访问量:78
如何删除/匿名化敏感数据并保持其完整性?
How delete/anonymize sensitive data and keep its integrity?
问:
我正在开发 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
用户流
- 用户创建患者并输入其地址。
- 用户为他们在current_day期间遇到的所有患者创建 n 个约会。
- 应用程序根据start_appointment和end_appointment计算行程(每当current_day中存在 >2 个约会时) 3a. 在行程模型中,对 start_appointment 和 end_appointment进行了验证,以避免重叠。 3b. 在任命模型中,start_time和end_time被验证(后者必须在第一个之后)。
- 每天凌晨 1 点触发recalculate_trip服务,以重新计算前一天的行程,以实现数据完整性。 4一个。删除约会将触发同一天的服务
- [在制品]用户可以为其客户/雇主导出(通过电子邮件发送)给定时间范围内的行程数据。
主要方法
使用地理编码器计算行驶距离的方法
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
感谢您到目前为止的阅读,我很高兴阅读您提出的解决方案和反馈。
答: 暂无答案
评论