Avatar
1
Farrar Harry Beginner
Farrar Harry Beginner
Xử lý soft delete cho quan hệ many-to-many
Xin chào mọi người, em đang gặp vấn đề về cách xử lý soft delete trong DB như sau:

Giả sử có 2 bảng Employee và Department với quan hệ n-n và 1 bảng trung gian emp-dept, tất cả các bảng đều có trường is_deleted để biểu diễn row đó đã xóa hay chưa( Khi xóa bản ghi thì gán giá trị is_deleted = true)

Khi thực hiện chức năng cập nhật (ví dụ cập nhật 1 employee sang các department khác) thì sẽ xử lý trên bảng trung gian. và em có nghĩ đến 2 cách để xử lý bảng trung gian này như sau:

  • Cách 1: Xóa toàn bộ các bản ghi cũ (update is_deleted = true) và thêm các bản ghi mới. Cách này có ưu điểm là dễ làm, chỉ việc xóa row cũ và thêm lại các row mới, nhược điểm là đối với các bản ghi đã có mà cập nhật thì cũng sẽ bị xóa đi và insert vào lại, dẫn đến bảng sẽ sớm bị phình to.
  • Cách 2: Giữ lại các bản ghi cũ nếu không thay đổi và thêm mới nếu chưa có. Cách này có ưu là bảng không bị phình như cách trên. nhưng nhược điểm là sẽ phải kiểm tra đầu vào trước, query vào db để lần lượt kiểm tra từng phần tử trong request xem cái nào có rồi thì bỏ qua, thêm mới những bản ghi chưa có và xóa những bản ghi không còn giá trị, sẽ phải check vất vả hơn cách trên.

Vậy theo mọi người, cách nào sẽ có hiệu quả tốt hơn. và trong thực tế khi xử lý soft delete thì mọi người thường làm thế nào.

Em xin cảm ơn.

  • Answer
sql soft delete
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
  1. Đối với trường hợp của em anh nghĩ em nên tổ chức bảng thế này:

Employee (
	long employeeId
)

Department (
	long departmentId
)

DepartmentEmployee (
	long id;
	long employeeId;
	long departmentId;
)

Vậy thì khi em cần cập nhật phòng ban cho user thì chỉ cần:

  • select e from DepartmentEmployee where e.employeeId and e.departmentId;
  • sau đó em update theo id em ạ: update DepartmentEmployee where e.id = x

  1. Đối với soft delete thì tuỳ theo chính sách về dữ liệu của công ty, nếu được phép sao lưu bản sao của dữ liệu thì cách tốt nhất là em nên tạo 1 database riêng và lưu lại các bản ghi đã bị xoá em ạ.
  • 0
  • Reply