Asked Aug 22nd, 2021 2:47 p.m. 161 0 3
  • 161 0 3
0

Đếm số user trong hệ thống.

Share
  • 161 0 3

Mình có một database user(id, parent_id) như hình dưới.

Yêu cầu nhập vào 1 ID bất kì và xuất ra tổng số user trong hệ thống đó ( tổng tất cả level 1->n) của ID đó.

VD:

  • ID =1 => Total Child = 6.
  • ID=2 => Total Child = 2
  • Tương tự ...

Không biết trong Laravel mình sẽ phải làm như nào cho tối ưu nhất?

Lưu ý số lượng user khá lớn ( có thể là nhiều nghìn) . Thanks

3 ANSWERS


Answered Aug 23rd, 2021 2:39 a.m.
+3
  1. Bạn có thể thực hiện sử dụng truy vấn bằng cách join các bảng với nhau và lấy count => Làm cách này thì sẽ rất lâu, nếu số lượng user lớn
  2. Bạn có thể thêm trường total_child vào bảng user tương ứng. Và thực hiện cập nhật lại trường total_child này nếu có tác vụ thay đổi liên quan tới child_user của user đó. => Cách này thì sẽ bị 1 vấn đề là dư thừa dữ liệu, và bạn phải thực hiện thêm vài tác vụ khác. Nhưng đổi lại bạn sẽ được lợi về vấn đề performance.

=> Bản thân mình sugguest làm theo cách 2 😍 @LongThanh.it

Share
Avatar LongThanh @LongThanh.it
Aug 23rd, 2021 10:56 a.m.

Cảm ơn bạn. Cách 1. Có mỗi 1 bảng mà join với ai nữa bạn?

0
| Reply
Share
Answered Aug 26th, 2021 1:57 p.m.
0

Đây là 1 cách mình nghĩ ra chưa chắc là tối ưu :p

Tạo thêm một col ở user tên là children và kiểu dữ liệu là json(longtext) lưu lại danh sách id của các user con và phân các bởi dấu phẩy. Nếu có cần truy vấn các con theo id thì đã có hàm find_in_set lo việc đó ^^

Khi muốn trả về chỉ cần ép sang dạng array hoặc list thì sau đó chỉ cần lấy length là được.

Share
Answered Aug 23rd, 2021 2:37 a.m.
-1

thêm trường count vào mỗi row để đếm số lượng phần tử con của nó.

id, parent_id, name, count

Khi thêm, sửa xóa con thì update cái count này đệ quy ngược lên từng level cho đến khi parent_id = 0. Chấp nhận thêm/ sửa / xóa sẽ chậm 1 chút nhưng việc xuất tổng số user của 1 node sẽ rất nhanh. Muốn tăng tốc thêm sửa xóa thì có thể cho cái update count này vào background job.

Share
Avatar LongThanh @LongThanh.it
Aug 23rd, 2021 10:56 a.m.

thanks

0
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.