profiles
认证用户的公开资料 · 1:1
认证归 auth,资料归 profiles。公开资料不暴露邮箱与密码哈希。
按学科、关键词和难度找到你此刻需要的那一道。静态展示版把搜索、筛选和详情阅读留在浏览器里。
拾错不是“先做界面,再补一个数据库”。每一张表都对应一个真实页面动作:谁可以看、谁能改、删除时留下什么、列表页要不要实时 count。这份说明把表结构、主外键、RLS 与前端路由放在同一张图上。
认证用户的公开资料 · 1:1
认证归 auth,资料归 profiles。公开资料不暴露邮箱与密码哈希。
错题内容与社交计数
自引用保留克隆血缘;状态与可见性分开,草稿不会误公开。
把题组织成专题
复合主键天然去重;每用户最多一个默认本。
auth.users 只负责认证,profiles 负责业务资料。公开主页可以读昵称和学校,却永远碰不到密码哈希与邮箱。
复合主键去重,复合外键防跨题回复,num_nonnulls 约束举报目标。应用层可以犯错,数据库层不让坏数据落地。
信息流不实时 count()。收藏、点赞、评论、克隆用触发器维护计数,列表页只读一个整数。
review_schedules 存“现在”,review_logs 存“发生过”。当前排期可覆盖,学习历史不可丢。
复合外键 (parent_id, mistake_id) 指向 comments(id, mistake_id),回复只能挂在同一道题下。
num_nonnulls(mistake_id, comment_id, target_user_id) = 1,三个可空外键恰好一个非空。
before insert or update 触发器重置计数并锁定 published_at,客户端不能改 owner 或发布时间。
状态表存当前到期日,日志表存每次评分;评分在 review_mistake() RPC 里原子完成。
同一套项目里,把认证、内容、文件、通知与复习提醒都放在 Supabase 的能力边界内。
Cookie 会话 + middleware 刷新;注册触发器创建 profile 与默认错题本。
权限、约束、计数器、审计都放在数据库层,前端不是最后一道防线。
avatars / question-images;公共读,写入限制在用户目录。
comments / notifications 已加入发布;前端订阅可继续扩展。
定时扫描到期复习,写通知,支持分页与去重。
mistake_feed / get_public_stats / review_mistake,读模型与写操作各有边界。
边界:静态展示版只保留公开阅读体验;完整登录、写入、管理后台和 Supabase 会话需在 Next.js 服务端运行。演示数据来自项目内置样例。