Tại sao nên chọn Supabase cho ứng dụng social media?
Supabase là một nền tảng Backend-as-a-Service (BaaS) mã nguồn mở, cung cấp cơ sở dữ liệu PostgreSQL đầy đủ tính năng, xác thực người dùng, lưu trữ tệp và API tự động. Với social media, nơi dữ liệu liên tục được tạo ra và cần xử lý thời gian thực, Supabase tỏ ra phù hợp nhờ khả năng scale nhanh, bảo mật cao và chi phí hợp lý so với các giải pháp truyền thống.
Thiết kế cơ sở dữ liệu
Một ứng dụng social media cơ bản cần các bảng chính sau:
– users: lưu thông tin người dùng.
– follows: ghi lại mối quan hệ follow giữa các users (follower_id, following_id).
– posts: chứa nội dung bài viết (user_id, content, created_at).
– likes: lưu lượt thích của user cho mỗi post (user_id, post_id).
– comments: chứa bình luận (user_id, post_id, content, created_at).
Ví dụ schema cho bảng follows:
CREATE TABLE follows (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
follower_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
following_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE (follower_id, following_id)
);Chỉ mục trên follower_id và following_id giúp truy vấn nhanh hơn khi hiển thị feed.
Xây dựng tính năng follow
Để người dùng có thể follow/unfollow, ta cần các hàm lưu trữ (stored procedures) để đảm bảo tính nguyên tử và bảo mật:
CREATE OR REPLACE FUNCTION toggle_follow(
follower_id_in UUID,
following_id_in UUID
)
RETURNS TABLE (
following BOOLEAN,
success BOOLEAN,
message TEXT
)
AS $$
BEGIN
IF follower_id_in = following_id_in THEN
RETURN QUERY SELECT FALSE, FALSE, 'Không thể follow chính mình';
ELSIF EXISTS (
SELECT 1 FROM follows
WHERE follower_id = follower_id_in AND following_id = following_id_in
) THEN
DELETE FROM follows
WHERE follower_id = follower_id_in AND following_id = following_id_in;
RETURN QUERY SELECT FALSE, TRUE, 'Đã unfollow';
ELSE
INSERT INTO follows (follower_id, following_id)
VALUES (follower_id_in, following_id_in);
RETURN QUERY SELECT TRUE, TRUE, 'Đã follow';
END IF;
END;
$$ LANGUAGE plpgsql;