Asked Mar 26th, 2018 5:49 AM 235 1 2
  • 235 1 2
0

Delete khi có quan hệ 1-N

Share
  • 235 1 2

E đang học và làm 1 project news sử dụng PHP. E đang gặp vấn đề và không biết thực tế thì sẽ xử lý thế nào, mong a.c dạy em với... Em đang làm 2 phần quản lý(thêm, sửa, xóa) category và post Phần xóa của Category nếu em xét relation bằng mysql và để cascade thì khi xóa 1 category thì tất cả các bài viết sẽ bị xóa. Và ngược lại nếu e ko xét relation, ko để casade thì khi xóa đi 1 category thì các bài post ko bị xóa, dẫn đễn sẽ có dữ liệu rác trong hệ thống E thấy cả 2 cách đều ko ổn, mong nhận đc sự gợi ý giúp đỡ của mọi người ạ

2 ANSWERS


Answered Mar 26th, 2018 7:40 AM
+2

Còn tuỳ thuộc vào tính chất của chức năng của em như thế nào, và em mong muốn dịch vụ thể hiện ra sao khi em xoá category nữa 😃

Như em miêu tả thì quan hệ giữa categorypost là quan hệ 1-n, và nếu 1 post luôn luôn phải thuộc về 1 và chỉ 1 category, thì có vẻ sự tồn tại của post đó sẽ không có ý nghĩa, nếu như mà category bị xoá, nên khi xoá category thì có thể xoá hết cả post đi!

Tuy nhiên cách làm này đôi khi khá nguy hiểm khi người quản trị có thể vô tình xoá bài viết ngoài ý muốn. Để giải quyết thì em có thể thêm ràng buộc là chỉ cho phép xoá category khi không có post nào thuộc về category ấy. Điều này sẽ buộc người quản trị phải di chuyển các post trong một category sang category khác, hay xoá post đi (một cách thủ công), trước khi xoá category đấy. Cách này có thể sẽ đem lại sự an toàn hơn cho dữ liệu, tuy nhiên đôi lúc sẽ khiến người quản trị cảm thấy phiền toái 😂

Ngoài ra khi xoá, em có thể cân nhắc lựa chọn soft delete (xoá logic, vẫn còn trong DB, nhưng không được select và hiển thị ra) và hard delete (xoá hoẳn khỏi DB).

Anh nghĩ có thể tổng kết như sau:

  • Nếu bắt buộc một 1 post luôn luôn phải thuộc về 1 và chỉ 1 category => khi xoá category cần xoá cả post, hoặc chuyển post sang category khác
  • Nếu 1 post có thể không thuộc về category nào, hoặc thuộc về nhiều category (cái này thì lại là quan hệ n-n, chắc không giống với câu hỏi của em nhưng thôi cứ liệt kê ra vậy 😄) thì có thể chỉ cần xoá category, bởi post vẫn có thể được hiển thị mà không gặp vấn đề gì.

Nhìn chung mỗi cách đều có một ưu và nhược điểm khác nhau, cũng tuỳ từng ngữ cảnh mà sử dụng cách thích hợp. Như anh thì luôn đặt sự toàn vẹn dữ liệu lên hàng đầu, nên anh sẽ ưu tiên chọn cách không cho phép xoá category khi mà nó không rỗng, mà khi xoá thì cũng chỉ soft delete thôi 😄

Share
Answered Mar 27th, 2018 7:31 AM
+1

Chào Nguyen Trung, Bài toán bạn hỏi là một bài toán phổ biến trong thực tế. Và kinh nghiệm xử lý thực tế gồm một số case sau:

  1. Basic nhất: Chỉ cho phép xóa Category nếu không có bài viết nào thuộc Category đó.
  2. Xóa cả bài viết: Cho phép xóa bài viết + yêu cầu người xác thực việc xóa Category sẽ xóa hết các bài Post thuộc Category đó.
  3. An toàn: Bạn tạo sẵn một Category là UnCategory hoặc Không phân loại. Khi nào bạn xóa Category thì chuyển hết các Post vào danh mục này.

Chúc bạn thành công,

Share