Yêu cầu thg 8 30, 2018 2:12 CH 385 0 3
  • 385 0 3
0

Lưu và thay đổi dữ liệu trong quan hệ nhiều nhiều.

Chia sẻ
  • 385 0 3

Chào buổi tối mọi người,
Em có chút thắc mắc mong mọi người giải đáp với ạ. Hiện tại em có 3 bảng dữ liệu là:
User - Role - UserRole
Bảng User và bảng Role có quan hệ nhiều nhiều và thông qua bảng UserRole
Và em đang khó khăn trong việc lưu dữ liệu khi edit dữ liệu.
Em có bảng

id user_id role_id
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5

Bây giờ ở người giao diện người dùng thay đổi các quyền của user đó.
Ví dụ người dùng muốn bỏ 2 role: 2,3 và thêm role: 6. Thì trong back_end mọi người thường xử lý như thế nào ạ.
Em thì có suy nghĩ 2 cách sau:

  • Cách 1: Em sẽ lấy params mới về so sánh id params trả về với trong database xem những id nào không có thì xóa đi và những id mới thì sẽ thêm vào.
  • Cách 2 (em hay làm): Đó là xóa hết những cái cũ đi và thêm mới lại theo params hiện tại.

Mặc dù em thấy 2 cách trên em nghĩ không hợp lí lắm nhưng vẫn chưa suy nghĩ cách nào hợp lí hơn. Nên em móng mọi người có kinh nghiệm giải đáp giúp em với ạ. Em xin cảm ơn!

3 CÂU TRẢ LỜI


Đã trả lời thg 8 30, 2018 2:58 CH
+1

Bản thân mình thì hay dùng cách 1 bạn nêu ra

Chia sẻ
Avatar Long @lelong
thg 8 30, 2018 3:06 CH

uhm, mình cũng nghĩ cách đó hay mà hơi lâu nên dùng cách 2 cho nhanh 😄 . Muốn hỏi xem cách anh làm lâu năm có cách nào hay hơn không.

Đã trả lời thg 8 30, 2018 3:31 CH
+1

C1: Dùng hai api thêm và xóa riêng

Nếu bạn dùng hai api thêm và xóa role của user riêng.

  1. Khi gọi api xóa thì post một mảng danh sách role_id lên rồi tìm và xóa nếu có:
DELETE FROM UserRole WHERE user_id = ? and role_id in (?, ?, ?)
  1. Khi gọi api insert role thì insert các records vào nếu chưa có:

VD: Mẫu query thêm role 10, 20, 30 cho user 1 vào bảng UserRole, nếu các role này chưa có trong DB. Role nào có thì không thêm mới nữa.

INSERT INTO UserRole (user_id, role_id)
SELECT *
FROM
(
  SELECT 1 as user_id, 10 as role_id FROM UserRole
  UNION ALL
  SELECT 1 as user_id, 20 as role_id FROM UserRole
  UNION ALL
  SELECT 1 as user_id, 30 as role_id FROM UserRole
) AS TEMP
WHERE NOT EXISTS (SELECT * FROM UserRole WHERE role_in IN (10, 20, 30) AND user_id = 1)

C2: Không dùng hai API

Tức dùng chung 1 api, api này nhận dữ liệu vào là mảng các role_id cần giữ cuả User (bao gồm cả role mới và cũ). Và hệ thống tự sync (xóa những role ko có, thêm những role mới).

VD: Xóa role 10, 20, thêm mới role 40, 50. Khi đó mảng roles_id đẩy lên gồm: [30, 40, 50] Lúc này bạn chạy 2 cây truy vấn, làm như sau:

  • Chạy câu truy vấn xóa toàn bộ những role không có trong params đẩy lên, tức những role đã bị xóa. => role_id not in (30, 40, 50) bị xóa <=> role 10, 20
  • Chạy câu truy vấn insert toàn bộ role trong params đẩy lên vào db (gồm cả role đã lưu và role mới). Thực hiện giống y hệt mục 2 ở trên. => Insert 30, 40, 50 nếu chưa có.

Kết luận

Trên đây là một cách triển khai chỉ mất 2 câu truy vấn, bạn cũng ko cần phải quan tâm role cũ hay mới, tồn tại hay không, không phải xử lý tách role cũ, mới rồi mới thực hiện truy vấn.

Chia sẻ
Đã trả lời thg 8 31, 2018 2:10 SA
+1

Mình cũng thấy cách 1 của bạn ổn hơn.

 Muốn hỏi xem cách anh làm lâu năm có cách nào hay hơn không.

Bạn đọc qua cái này xem có thể giúp gì cho bạn không https://github.com/Zizaco/entrust 😄

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí