Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 47 — Privacy by Design — PDPL Compliance

Data Modeling and ERD Mastery Bài 47/60

Mở đầu — vì sao bài này quan trọng

Trong hầu hết các khóa học về data modeling, người ta dạy bạn cách thiết kế bảng sao cho chuẩn hóa, cách chọn khóa chính, cách vẽ quan hệ. Nhưng có một câu hỏi mà rất ít mô hình dữ liệu ở Việt Nam trả lời được cho đến khi bị thanh tra: "Ai được phép xem trường dữ liệu này, vì mục đích gì, và khi nào phải xóa nó đi?"

Kể từ ngày 1/7/2023, câu hỏi đó không còn là chuyện đạo đức nghề nghiệp nữa — nó là nghĩa vụ pháp lý. Nghị định 13/2023/NĐ-CP về Bảo vệ dữ liệu cá nhân (thường gọi tắt là PDPL — Personal Data Protection Law/Decree) đã đặt ra khung pháp lý đầu tiên và toàn diện của Việt Nam về dữ liệu cá nhân. Và điều đáng nói với chúng ta — những người làm phân tích nghiệp vụ và thiết kế dữ liệu — là: rất nhiều yêu cầu của Nghị định 13 phải được giải quyết ngay tại tầng mô hình dữ liệu, chứ không phải "vá" bằng code hay chính sách sau này.

Đây chính là tinh thần của Privacy by Design (Bảo vệ quyền riêng tư ngay từ khâu thiết kế): thay vì coi quyền riêng tư là một tính năng bổ sung, ta nhúng nó vào cấu trúc dữ liệu ngay từ đầu. Một BA hiểu Privacy by Design sẽ thiết kế ra schema mà khi hệ thống lớn lên, việc tuân thủ pháp luật là chuyện tự nhiên — chứ không phải một cơn ác mộng migration đau đớn. Bài này sẽ chỉ cho bạn cách biến những điều khoản pháp lý thành quyết định thiết kế cụ thể trên ERD của bạn.

Khái niệm cốt lõi

Privacy by Design là gì

Privacy by Design (PbD) là một triết lý thiết kế gồm 7 nguyên tắc, do Ann Cavoukian đề xuất. Với người làm data modeling, ba nguyên tắc quan trọng nhất là:

  • Chủ động, không bị động (Proactive not Reactive): lường trước rủi ro về quyền riêng tư trước khi nó xảy ra, ngay khi vẽ ERD.
  • Riêng tư là mặc định (Privacy as the Default): người dùng không cần làm gì thì dữ liệu của họ vẫn được bảo vệ. Trong mô hình dữ liệu, điều này nghĩa là mặc định thu thập ít nhất, mặc định không chia sẻ.
  • Nhúng vào thiết kế (Embedded into Design): quyền riêng tư là một phần của cấu trúc bảng, không phải một lớp phủ bên ngoài.

Những khái niệm của Nghị định 13 mà BA phải nắm

Dữ liệu cá nhân (Personal Data) được Nghị định 13 chia làm hai loại, và sự phân biệt này ảnh hưởng trực tiếp đến cách bạn thiết kế:

  • Dữ liệu cá nhân cơ bản: họ tên, ngày sinh, số điện thoại, CCCD, địa chỉ, email, tình trạng hôn nhân, thông tin tài khoản...
  • Dữ liệu cá nhân nhạy cảm: quan điểm chính trị, tôn giáo, tình trạng sức khỏe, dữ liệu sinh trắc học, đời sống tình dục, dữ liệu về tội phạm, vị trí địa lý cá nhân... Loại này đòi hỏi mức bảo vệ và sự đồng ý chặt chẽ hơn nhiều.
Với một BA, điều này có nghĩa: mỗi attribute trên ERD cần được gắn nhãn phân loại (data classification) — đây là cơ bản, nhạy cảm, hay không phải dữ liệu cá nhân. Đây là bước đầu tiên và quan trọng nhất.

Sự đồng ý (Consent): Nghị định 13 quy định việc xử lý dữ liệu cá nhân về nguyên tắc phải có sự đồng ý của chủ thể dữ liệu, và sự đồng ý phải rõ ràng, cụ thể theo từng mục đích. Điều này buộc mô hình dữ liệu phải lưu trữ được lịch sử đồng ý: ai đồng ý, cho mục đích gì, vào lúc nào, qua kênh nào, và đã rút lại chưa.

Mục đích xử lý (Purpose): dữ liệu chỉ được dùng đúng mục đích đã thông báo. Một trường số điện thoại thu thập để "giao hàng" không được tự nhiên dùng để "gửi quảng cáo". Về mặt mô hình, mục đích cần được ràng buộc với consent.

Quyền của chủ thể dữ liệu: người dùng có quyền truy cập, chỉnh sửa, xóa, rút lại đồng ý, yêu cầu hạn chế xử lý. Mô hình dữ liệu của bạn phải hỗ trợ được các thao tác này — đặc biệt là quyền được xóa (right to erasure), thứ mà rất nhiều schema thiết kế cứng nhắc không làm nổi vì dữ liệu cá nhân bị nhét lẫn lộn khắp nơi.

Bốn kỹ thuật mô hình hóa cho Privacy by Design

  • Data minimization (tối thiểu hóa dữ liệu): đừng tạo cột chỉ vì "biết đâu sau này cần". Mỗi cột dữ liệu cá nhân phải trả lời được: mục đích nghiệp vụ là gì?
  • Tách và cô lập dữ liệu nhạy cảm: thay vì để CCCD, thông tin sức khỏe nằm chung trong bảng customers khổng lồ, hãy tách sang bảng riêng (ví dụ customer_sensitive_data) với quan hệ 1-1. Điều này giúp phân quyền, mã hóa, và xóa dễ dàng hơn.
  • Pseudonymization và tokenization: thay giá trị thật bằng mã định danh giả. Ví dụ, thay vì lưu CCCD trực tiếp, ta lưu một token và giữ bảng ánh xạ ở nơi bảo mật riêng.
  • Soft delete có thời hạn + retention policy: mỗi loại dữ liệu cá nhân nên có một chính sách lưu trữ (thời hạn giữ), và mô hình cần cột hỗ trợ việc xóa/ẩn danh sau khi hết hạn.

Tình huống thực tế

Tình huống 1 — Sàn thương mại điện tử "ChợViệt" và cột số điện thoại "tiện tay"

Một sàn TMĐT giả định tên ChợViệt có bảng orders chứa customer_phone, customer_name, shipping_address được sao chép trực tiếp vào mỗi đơn hàng để "cho tiện in vận đơn". Sau 3 năm hoạt động, họ có 12 triệu đơn hàng, và số điện thoại khách bị nhân bản hàng chục lần khắp các bảng orders, order_logs, invoices, sms_queue.

Khi một khách hàng gửi yêu cầu xóa dữ liệu theo quyền tại Nghị định 13, đội kỹ thuật hoảng loạn: dữ liệu cá nhân của người này nằm rải rác ở ít nhất 7 bảng, không có cách nào truy vết một cách tin cậy. Việc xóa thủ công mất 2 ngày cho một khách, và không đảm bảo xóa sạch.

Diễn giải: vấn đề gốc là ở mô hình dữ liệu — họ vi phạm chuẩn hóa vì lý do "tiện", và quan trọng hơn, họ không tập trung hóa dữ liệu cá nhân. Đúng ra, thông tin liên hệ khách chỉ nên nằm ở một chỗ (bảng customers hoặc customer_contacts), còn orders chỉ tham chiếu qua customer_id. Việc in vận đơn cần thì snapshot có kiểm soát, có gắn thời hạn xóa.

Bài học: Privacy by Design bắt đầu từ việc không sao chép dữ liệu cá nhân bừa bãi. Mỗi lần bạn nhân bản một trường dữ liệu cá nhân, bạn nhân bản luôn nghĩa vụ pháp lý xóa và bảo vệ nó.

Tình huống 2 — Phòng khám "An Tâm Clinic" và dữ liệu nhạy cảm nằm chung bảng

Một chuỗi phòng khám giả định An Tâm Clinic thiết kế bảng patients với đầy đủ: full_name, phone, blood_type, chronic_diseases, hiv_status, mental_health_notes. Toàn bộ nhân viên lễ tân đều có quyền SELECT * trên bảng này để tra cứu lịch hẹn.

Vấn đề: hiv_statusmental_health_notes là dữ liệu cá nhân nhạy cảm theo Nghị định 13, đòi hỏi mức bảo vệ và kiểm soát truy cập nghiêm ngặt. Nhưng vì mọi thứ nằm chung một bảng, lễ tân — người chỉ cần tên và số điện thoại — lại vô tình có quyền xem cả tình trạng HIV của bệnh nhân. Đây là lỗ hổng tuân thủ nghiêm trọng.

Diễn giải: giải pháp mô hình hóa là tách dữ liệu nhạy cảm ra bảng riêng patient_sensitive_records với quan hệ 1-1 tới patients, gắn phân quyền chặt (chỉ bác sĩ điều trị mới truy cập được), mã hóa ở mức cột, và ghi log mọi lần truy cập. Bảng patients chỉ giữ dữ liệu cơ bản.

Bài học: phân loại dữ liệu (data classification) phải dẫn tới quyết định cấu trúc. Dữ liệu nhạy cảm và dữ liệu cơ bản không nên ngồi chung một bàn nếu quyền truy cập của chúng khác nhau.

Tình huống 3 — Ứng dụng gọi xe "GoNhanh" và bài toán consent theo mục đích

Một ứng dụng gọi xe giả định GoNhanh thu thập vị trí GPS của người dùng. Ban đầu vị trí chỉ dùng để ghép tài xế. Sau đó bộ phận marketing muốn dùng lịch sử vị trí để gợi ý cửa hàng gần nhà. Về mặt pháp lý, đây là mục đích mới, và vị trí địa lý là dữ liệu nhạy cảm — nên cần một sự đồng ý riêng, không thể "gộp" vào đồng ý ban đầu.

Nhưng schema của GoNhanh chỉ có một cột consent_accepted = TRUE duy nhất trong bảng users. Không có cách nào biết người dùng đồng ý cho mục đích nào. Khi cơ quan chức năng yêu cầu chứng minh, họ không có bằng chứng.

Diễn giải: cần một mô hình consent dạng bảng riêng: user_consents(consent_id, user_id, purpose_code, granted_at, revoked_at, channel, consent_version). Mỗi mục đích (purpose_code như MATCHING, MARKETING, ANALYTICS) là một dòng riêng. Khi người dùng rút lại đồng ý cho marketing, ta chỉ cần set revoked_at, và hệ thống ngừng dùng vị trí cho mục đích đó — nhưng vẫn giữ cho việc ghép xe.

Bài học: consent không phải một cờ boolean. Nó là một thực thể có vòng đời, có mục đích, có thời điểm, và có lịch sử. Mô hình đúng cho consent là nền tảng của tuân thủ.

Hướng dẫn từng bước

Đây là quy trình thực tế để nhúng Privacy by Design vào một mô hình dữ liệu:

Bước 1 — Lập bản đồ dữ liệu cá nhân (Data Inventory). Duyệt qua từng entity và attribute trên ERD. Với mỗi attribute, gắn nhãn: NON_PERSONAL, PERSONAL_BASIC, hay PERSONAL_SENSITIVE. Ghi kèm mục đích thu thập. Đây là bản mở rộng của data dictionary mà bạn đã học ở bài trước, thêm cột phân loại quyền riêng tư.

Bước 2 — Áp dụng data minimization. Với mỗi attribute cá nhân, hỏi: "Có mục đích nghiệp vụ rõ ràng không?" Nếu không, loại bỏ. Ví dụ, một form đăng ký newsletter không cần CCCD.

Bước 3 — Tách dữ liệu nhạy cảm. Nhóm các attribute PERSONAL_SENSITIVE và tách thành bảng con với quan hệ 1-1, để phân quyền và mã hóa độc lập.

Bước 4 — Thiết kế mô hình consent. Tạo bảng consent_purposes (danh mục mục đích) và user_consents (lịch sử đồng ý theo mục đích). Đảm bảo hỗ trợ cả cấp và rút lại.

Bước 5 — Gắn retention policy. Với mỗi nhóm dữ liệu, xác định thời hạn lưu trữ (ví dụ: dữ liệu đơn hàng giữ 10 năm theo luật kế toán, nhưng log vị trí chỉ giữ 90 ngày). Thêm cột retention_until hoặc bảng chính sách để job tự động ẩn danh/xóa.

Bước 6 — Thiết kế cho quyền được xóa. Đảm bảo mọi dữ liệu cá nhân của một người có thể truy vết qua user_id và xóa/ẩn danh một cách nhất quán. Cân nhắc kỹ thuật anonymization thay vì xóa cứng khi cần giữ dữ liệu thống kê (thay tên bằng "Người dùng đã xóa", băm số điện thoại).

Bước 7 — Thêm audit trail cho truy cập dữ liệu nhạy cảm. Ghi log ai đã xem/sửa dữ liệu nhạy cảm, khi nào — đây vừa là yêu cầu tuân thủ, vừa là bằng chứng khi bị thanh tra.

Lỗi thường gặp & mẹo

Lỗi 1 — Coi consent là một cột boolean. Như tình huống GoNhanh cho thấy, has_consent = TRUE không đủ. Bạn không chứng minh được đồng ý cho mục đích nào, phiên bản điều khoản nào. Mẹo: luôn mô hình consent như một bảng lịch sử theo mục đích.

Lỗi 2 — Sao chép dữ liệu cá nhân để "tiện". Denormalization vì hiệu năng là hợp lý (bạn đã học ở Bài 15), nhưng với dữ liệu cá nhân, mỗi bản sao là một nghĩa vụ pháp lý bổ sung. Mẹo: nếu buộc phải snapshot, hãy đánh dấu rõ và đưa vào phạm vi xóa.

Lỗi 3 — Xóa cứng làm hỏng toàn vẹn tham chiếu. Xóa một khách hàng bằng DELETE có thể phá vỡ hóa đơn, làm sai báo cáo tài chính. Mẹo: ưu tiên anonymization — giữ dòng dữ liệu nghiệp vụ nhưng ẩn danh phần cá nhân, thay vì xóa toàn bộ.

Lỗi 4 — Không phân biệt dữ liệu cơ bản và nhạy cảm. Gộp tất cả vào một bảng khiến phân quyền bất khả thi. Mẹo: dùng data classification để quyết định tách bảng.

Lỗi 5 — Quên phiên bản điều khoản (consent version). Điều khoản thay đổi theo thời gian. Nếu không lưu consent_version, bạn không biết người dùng đã đồng ý với phiên bản chính sách nào. Mẹo: luôn có cột phiên bản trong bảng consent.

Mẹo tổng quát: Hãy coi phân loại dữ liệu như một thuộc tính metadata bắt buộc trên mọi ERD bạn vẽ từ giờ. Khi đội dev nhìn vào bảng, họ phải biết ngay cột nào là dữ liệu nhạy cảm mà không cần đoán.

Bài tập thực hành

Bối cảnh: Bạn là BA cho một ứng dụng học trực tuyến giả định tên HọcNhanh, tương tự nền tảng bạn đang học. Ứng dụng thu thập: họ tên, email, số điện thoại, ngày sinh, ảnh đại diện, lịch sử học tập, phương thức thanh toán (4 số cuối thẻ), và tùy chọn cho phép nhận email marketing.

Yêu cầu:

  • Lập bảng data inventory: liệt kê từng attribute và phân loại NON_PERSONAL / PERSONAL_BASIC / PERSONAL_SENSITIVE, kèm mục đích thu thập.
  • Vẽ ERD (bằng công cụ bất kỳ, hoặc Mermaid như Bài 43) cho các entity: users, consent_purposes, user_consents, và bất kỳ bảng nào bạn cho là cần tách để bảo vệ dữ liệu.
  • Thiết kế bảng user_consents sao cho một người dùng có thể: đồng ý nhận marketing hôm nay, rút lại sau 3 tháng, rồi đồng ý lại — và toàn bộ lịch sử này phải truy vết được.
  • Đề xuất chiến lược cho quyền được xóa: khi người dùng rời đi, những trường nào bị xóa cứng, những trường nào ẩn danh, và tại sao (gợi ý: lịch sử thanh toán có ràng buộc kế toán).
  • Đề xuất retention policy cho ít nhất 3 loại dữ liệu khác nhau.
Gợi ý chấm điểm cho bản thân: một lời giải tốt sẽ có consent là bảng lịch sử chứ không phải cột boolean, có tách dữ liệu thanh toán khỏi bảng users chính, và phân biệt rõ giữa xóa cứng và ẩn danh.

Tóm tắt

Privacy by Design không phải một tính năng bạn thêm vào phút chót — nó là cách bạn nghĩ về dữ liệu ngay từ nét vẽ đầu tiên trên ERD. Nghị định 13/2023, có hiệu lực từ 1/7/2023, đặt ra những nghĩa vụ cụ thể mà tầng mô hình dữ liệu phải gánh: phân loại dữ liệu cá nhân cơ bản và nhạy cảm, thu thập tối thiểu, lưu consent theo từng mục đích, hỗ trợ quyền truy cập và xóa, và áp dụng retention policy.

Với vai trò một BA hay data modeler, ba việc quan trọng nhất cần nhớ: (1) gắn nhãn phân loại quyền riêng tư cho mọi attribute; (2) tách và cô lập dữ liệu nhạy cảm để phân quyền được; và (3) mô hình hóa consent như một thực thể có vòng đời, không phải một cờ boolean. Ba tình huống ChợViệt, An Tâm Clinic và GoNhanh cho thấy cái giá của việc bỏ qua những nguyên tắc này là những cơn ác mộng migration và rủi ro pháp lý thật sự. Thiết kế đúng ngay từ đầu — đó chính là cách một mô hình dữ liệu vừa sạch, vừa tuân thủ, vừa bền vững.