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
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
Bài liên quan
Cách 2: Dùng từ khóa IN của sql
Nếu bạn muốn nhanh thì nên viết cache thủ công.
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
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...
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