10/10/2018, 10:55

Hỏi chút về thiết kế cơ sở dữ liệu!

Mình chưa có kinh nghiệm khoản này lắm nên muốn hỏi các bạn có kinh nghiệm!
Mình đang làm tính năng kết bạn trên web.Kiểu như sẽ có 1 cái list bạn bè trên web .Sau đó mỗi lần đăng nhập nó sẽ hiện cái list này ra và ai đang offline, online sẽ hiện lên.Mình định thiết kế 1 column kiểu text để lưu list được liên kết với nhau bởi dấu | VD "abc|edf" thì có 2 người bạn là abc và def
Sau đó tạo query để xem người đó online hay offline[Trang web của mình tự động out sau 10 phút là có 1 column lưu thơi gian hoạt động cuối của người dùng đó bây giờ chỉ query xem thời gian cuối là biết on hay off]
vấn đề là nếu danh sách kéo dài khoảng 20,30 thậm trí là hơn thì query hơi nản.
Bạn nào có cách làm hay hơn không chỉ mình với, thanks
fsviet viết 13:05 ngày 10/10/2018
chỉ việc đối chiếu list có sẵn với list đang onl, nếu ai kô onl thì off khó jì đâu nhở
Steve_App viết 13:08 ngày 10/10/2018
"Quá ngắn để thực sự hiểu bạn đang nói gì ,Bạn có thể chỉ rõ các làm được không.Database như thế nào, cách query ra sao? Cảm ơn trước nha !"
thuyduongcd viết 12:56 ngày 10/10/2018
Cách 1: Explode nó ra thành mảng rồi dùng foreach để truy vấn DB.
Cách 2: Dùng từ khóa IN của sql
Steve_App viết 13:07 ngày 10/10/2018
Thanks bạn,nhưng vấn đề là mình muốn giảm thiểu tối đa số lần query đến db cơ.Cảm giác đó là do vấn đề thiết kê bd nên mình muốn bạn nào "hiến kế" sao cho thiết kế vẫn đảm bảo tính năng mà giảm lượng query nhất ![Từ khóa IN cũng là 1 gợi ý không tệ !]
khoathi viết 13:02 ngày 10/10/2018
Không biết bạn dùng CSDL gì nhỉ? Nếu bạn dùng SQL server bạn có thể viết SP xử lý việc này đó. Chỉ cần 1 lần duy nhất query đến DB nhưng bạn có thể tiến hành xử lý nhiều công việc.
haicop viết 13:05 ngày 10/10/2018
Theo mình thì không nên thiết kế dữ liệu theo kiểu đó, nên làm riêng 1 bảng friend rồi join 2 bảng vào, chuẩn hóa dữ liệu luôn làm công việc nhẹ nhàng và khoa học hơn.

Nếu bạn muốn nhanh thì nên viết cache thủ công.
fsviet viết 13:00 ngày 10/10/2018
user - user_friends(UserId, FriendId)
User A login vào thành công:
- chắc chắc là lấy được danh sách friend (ds K)
- Đánh dấu được user A online vào danh sách onl của hệ thống (ds H)

Câu hỏi đặt ra làm sao xác định dc trong ds K có bao nhiêu người onl?
Đơn giản, duyệt ds K lấy từng user hỏi hệ thống xem thằng này có trong ds H kô. Có thì đánh dấu nói onl. Xong
chesterben viết 13:09 ngày 10/10/2018
@Steve_App:
Có phải bạn quan tâm đến việc tăng tốc độ truy vấn và giảm tối đa truy vấn đến DB đúng ko?

Nếu đúng như vậy, bạn phải bỏ qua hoặc giảm tối đa các chức năng sau của SQL: ForeignKey, JOIN. Nghĩa là bạn phải thiết kế hoàn toàn là raw data, ko hề có object relationship. Ví dụ:

Friends:
id Int(5)
member_user Int(5)
friend_user Int(5) //Thay vì là trỏ đến bảng Users.

Vậy thì khi lấy dữ liệu bạn phải dùng thuật toán để lấy ra đúng thông tin cần lấy. Lúc này ta dùng một cache framework nào đó (như memcached) để giảm tính toán.

Tuy nhiên, giải pháp ở trên cũng chỉ là tình thế. Đối với server dạng comet/push thì người ta ko dùng SQL nữa rồi. Bạn có thể tham khảo khái niệm NoSQL. Tiêu biểu như: Cassandra (Facebook, Digg), MongoDB, Neo4j...
Steve_App viết 12:56 ngày 10/10/2018
Thanks my friends ,very helpful!
Ngồi ngâm cái vbb thấy họ thiết kế dự liệu kiểu này ,1 table "userlist" các field "userid relationid type friend"
nếu id 1 làm bạn id 2 kết quả sẽ ra:
1 2 buddy yes
2 1 buddy yes
Sau đó có lẽ họ query đến lấy dữ liệu từ table này với điều kiện id=1 hay id =2 gì đấy !
Đây có vẻ là 1 cách tốt ,
(ai có cách hay hơn cứ post nha)Thân !
@chesterben:bây giờ mới nghe tới nó thanks buddy
Bài liên quan
0