用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/KunanonJ/ai-skills-hub --skill cursor-plugin-convex-rule-schema-design命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | cursor-plugin-convex-rule-schema-design |
| description | Design flat, relational schemas with proper indexes instead of deep nesting |
| metadata | {"version":"0.1.0"} |
Design schemas to be document-relational: relatively flat documents with relationships via IDs, not deeply nested structures.
// ❌ Don't do this
export default defineSchema({
users: defineTable({
name: v.string(),
posts: v.array(v.object({
title: v.string(),
content: v.string(),
comments: v.array(v.object({
text: v.string(),
author: v.string(),
})),
})),
}),
});
This makes it hard to update specific posts, limits you to 8,192 posts per user, and prevents efficient queries.
// ✅ Do this
export default defineSchema({
users: defineTable({
name: v.string(),
email: v.string(),
}).index("by_email", ["email"]),
posts: defineTable({
userId: v.id("users"),
title: v.string(),
content: v.string(),
}).index("by_user", ["userId"])
.index("by_user_and_created", ["userId", "createdAt"]),
comments: defineTable({
postId: v.id("posts"),
userId: v.id("users"),
text: v.string(),
}).index("by_post", ["postId"])
.index("by_user", ["userId"]),
});
Arrays work well for:
users: defineTable({
name: v.string(),
roles: v.array(v.union(v.literal("admin"), v.literal("editor"), v.literal("viewer"))),
favoriteColors: v.array(v.string()), // Small list
}),
Always add indexes for foreign key lookups:
.index("by_user", ["userId"])
.index("by_team", ["teamId"])
.index("by_parent", ["parentId"])