Files
2025-11-30 09:06:02 +08:00

20 KiB

PocketBase Schema Templates

Pre-built collection schemas for common application types.

Table of Contents

  1. Blog Platform
  2. E-commerce Store
  3. Social Network
  4. Task Management
  5. Forum/Discussion Board
  6. Real Estate Listings
  7. Learning Management System

Blog Platform

Posts Collection

{
  "id": "posts",
  "name": "Posts",
  "type": "base",
  "system": false,
  "schema": [
    {
      "id": "title",
      "name": "title",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "slug",
      "name": "slug",
      "type": "text",
      "required": true,
      "unique": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "content",
      "name": "content",
      "type": "text",
      "required": true,
      "options": {
        "min": 1
      }
    },
    {
      "id": "excerpt",
      "name": "excerpt",
      "type": "text",
      "options": {
        "max": 500
      }
    },
    {
      "id": "featured_image",
      "name": "featured_image",
      "type": "file",
      "required": false,
      "options": {
        "maxSelect": 1,
        "maxSize": 5242880,
        "mimeTypes": ["image/jpeg", "image/png", "image/webp"]
      }
    },
    {
      "id": "author",
      "name": "author",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "category",
      "name": "category",
      "type": "relation",
      "options": {
        "collectionId": "categories",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "tags",
      "name": "tags",
      "type": "text",
      "options": {
        "maxSelect": 50
      }
    },
    {
      "id": "status",
      "name": "status",
      "type": "select",
      "required": true,
      "options": {
        "values": ["draft", "published", "archived"]
      }
    },
    {
      "id": "published_date",
      "name": "published_date",
      "type": "date",
      "required": false
    },
    {
      "id": "view_count",
      "name": "view_count",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    }
  ],
  "listRule": "status = 'published'",
  "viewRule": "status = 'published'",
  "createRule": "@request.auth.id != ''",
  "updateRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

Categories Collection

{
  "id": "categories",
  "name": "Categories",
  "type": "base",
  "system": false,
  "schema": [
    {
      "id": "name",
      "name": "name",
      "type": "text",
      "required": true,
      "unique": true,
      "options": {
        "min": 1,
        "max": 100
      }
    },
    {
      "id": "slug",
      "name": "slug",
      "type": "text",
      "required": true,
      "unique": true,
      "options": {
        "min": 1,
        "max": 100
      }
    },
    {
      "id": "description",
      "name": "description",
      "type": "text",
      "options": {
        "max": 500
      }
    },
    {
      "id": "color",
      "name": "color",
      "type": "text",
      "options": {
        "max": 7
      }
    }
  ],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "@request.auth.id != ''",
  "deleteRule": "@request.auth.id != ''"
}

Comments Collection

{
  "id": "comments",
  "name": "Comments",
  "type": "base",
  "system": false,
  "schema": [
    {
      "id": "content",
      "name": "content",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 1000
      }
    },
    {
      "id": "author",
      "name": "author",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "post",
      "name": "post",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "posts",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    },
    {
      "id": "parent",
      "name": "parent",
      "type": "relation",
      "options": {
        "collectionId": "comments",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "is_approved",
      "name": "is_approved",
      "type": "bool",
      "required": true
    }
  ],
  "listRule": "is_approved = true",
  "viewRule": "is_approved = true",
  "createRule": "@request.auth.id != ''",
  "updateRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

E-commerce Store

Products Collection

{
  "id": "products",
  "name": "Products",
  "type": "base",
  "schema": [
    {
      "id": "name",
      "name": "name",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "slug",
      "name": "slug",
      "type": "text",
      "required": true,
      "unique": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "description",
      "name": "description",
      "type": "text",
      "options": {}
    },
    {
      "id": "price",
      "name": "price",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    },
    {
      "id": "compare_at_price",
      "name": "compare_at_price",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "sku",
      "name": "sku",
      "type": "text",
      "unique": true,
      "options": {
        "min": 1,
        "max": 100
      }
    },
    {
      "id": "inventory",
      "name": "inventory",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    },
    {
      "id": "images",
      "name": "images",
      "type": "file",
      "options": {
        "maxSelect": 10,
        "maxSize": 10485760,
        "mimeTypes": ["image/jpeg", "image/png", "image/webp"]
      }
    },
    {
      "id": "category",
      "name": "category",
      "type": "relation",
      "options": {
        "collectionId": "categories",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "is_active",
      "name": "is_active",
      "type": "bool",
      "required": true
    }
  ],
  "listRule": "is_active = true",
  "viewRule": "is_active = true",
  "createRule": "@request.auth.id != ''",
  "updateRule": "@request.auth.id != ''",
  "deleteRule": "@request.auth.id != ''"
}

Orders Collection

{
  "id": "orders",
  "name": "Orders",
  "type": "base",
  "schema": [
    {
      "id": "order_number",
      "name": "order_number",
      "type": "text",
      "required": true,
      "unique": true,
      "options": {
        "min": 1,
        "max": 100
      }
    },
    {
      "id": "customer",
      "name": "customer",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "items",
      "name": "items",
      "type": "json",
      "required": true
    },
    {
      "id": "subtotal",
      "name": "subtotal",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    },
    {
      "id": "tax",
      "name": "tax",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "shipping",
      "name": "shipping",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "total",
      "name": "total",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    },
    {
      "id": "status",
      "name": "status",
      "type": "select",
      "required": true,
      "options": {
        "values": ["pending", "processing", "shipped", "delivered", "cancelled", "refunded"]
      }
    },
    {
      "id": "shipping_address",
      "name": "shipping_address",
      "type": "json",
      "required": true
    },
    {
      "id": "notes",
      "name": "notes",
      "type": "text",
      "options": {}
    }
  ],
  "listRule": "customer = @request.auth.id",
  "viewRule": "customer = @request.auth.id",
  "createRule": "customer = @request.auth.id",
  "updateRule": "@request.auth.id != ''",
  "deleteRule": "@request.auth.id != ''"
}

Social Network

Posts Collection

{
  "id": "posts",
  "name": "Posts",
  "type": "base",
  "schema": [
    {
      "id": "content",
      "name": "content",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 2000
      }
    },
    {
      "id": "image",
      "name": "image",
      "type": "file",
      "options": {
        "maxSelect": 1,
        "maxSize": 10485760,
        "mimeTypes": ["image/jpeg", "image/png", "image/webp"]
      }
    },
    {
      "id": "author",
      "name": "author",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    }
  ],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "author = @request.auth.id",
  "deleteRule": "author = @request.auth.id"
}

Likes Collection

{
  "id": "likes",
  "name": "Likes",
  "type": "base",
  "schema": [
    {
      "id": "user",
      "name": "user",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    },
    {
      "id": "post",
      "name": "post",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "posts",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    }
  ],
  "indexes": ["CREATE UNIQUE INDEX idx_likes_user_post ON likes (user, post)"],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "@request.auth.id != ''",
  "deleteRule": "user = @request.auth.id"
}

Task Management

Tasks Collection

{
  "id": "tasks",
  "name": "Tasks",
  "type": "base",
  "schema": [
    {
      "id": "title",
      "name": "title",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "description",
      "name": "description",
      "type": "text",
      "options": {}
    },
    {
      "id": "status",
      "name": "status",
      "type": "select",
      "required": true,
      "options": {
        "values": ["todo", "in_progress", "review", "done"]
      }
    },
    {
      "id": "priority",
      "name": "priority",
      "type": "select",
      "required": true,
      "options": {
        "values": ["low", "medium", "high", "urgent"]
      }
    },
    {
      "id": "assignee",
      "name": "assignee",
      "type": "relation",
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "reporter",
      "name": "reporter",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "due_date",
      "name": "due_date",
      "type": "date",
      "required": false
    },
    {
      "id": "tags",
      "name": "tags",
      "type": "text",
      "options": {
        "maxSelect": 20
      }
    }
  ],
  "listRule": "assignee = @request.auth.id || reporter = @request.auth.id",
  "viewRule": "assignee = @request.auth.id || reporter = @request.auth.id",
  "createRule": "@request.auth.id != ''",
  "updateRule": "assignee = @request.auth.id || reporter = @request.auth.id",
  "deleteRule": "reporter = @request.auth.id"
}

Forum/Discussion Board

Threads Collection

{
  "id": "threads",
  "name": "Threads",
  "type": "base",
  "schema": [
    {
      "id": "title",
      "name": "title",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "content",
      "name": "content",
      "type": "text",
      "required": true,
      "options": {
        "min": 1
      }
    },
    {
      "id": "author",
      "name": "author",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "category",
      "name": "category",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "categories",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "is_pinned",
      "name": "is_pinned",
      "type": "bool",
      "required": true
    },
    {
      "id": "is_locked",
      "name": "is_locked",
      "type": "bool",
      "required": true
    },
    {
      "id": "view_count",
      "name": "view_count",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    }
  ],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

Replies Collection

{
  "id": "replies",
  "name": "Replies",
  "type": "base",
  "schema": [
    {
      "id": "content",
      "name": "content",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 5000
      }
    },
    {
      "id": "author",
      "name": "author",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "thread",
      "name": "thread",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "threads",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    },
    {
      "id": "parent",
      "name": "parent",
      "type": "relation",
      "options": {
        "collectionId": "replies",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    }
  ],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "author = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

Real Estate Listings

Properties Collection

{
  "id": "properties",
  "name": "Properties",
  "type": "base",
  "schema": [
    {
      "id": "title",
      "name": "title",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "description",
      "name": "description",
      "type": "text",
      "options": {}
    },
    {
      "id": "price",
      "name": "price",
      "type": "number",
      "required": true,
      "options": {
        "min": 0
      }
    },
    {
      "id": "property_type",
      "name": "property_type",
      "type": "select",
      "required": true,
      "options": {
        "values": ["house", "apartment", "condo", "land", "commercial"]
      }
    },
    {
      "id": "address",
      "name": "address",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 500
      }
    },
    {
      "id": "city",
      "name": "city",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 100
      }
    },
    {
      "id": "state",
      "name": "state",
      "type": "text",
      "required": true,
      "options": {
        "min": 2,
        "max": 2
      }
    },
    {
      "id": "zip_code",
      "name": "zip_code",
      "type": "text",
      "required": true,
      "options": {
        "min": 5,
        "max": 10
      }
    },
    {
      "id": "bedrooms",
      "name": "bedrooms",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "bathrooms",
      "name": "bathrooms",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "square_feet",
      "name": "square_feet",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "images",
      "name": "images",
      "type": "file",
      "options": {
        "maxSelect": 20,
        "maxSize": 10485760,
        "mimeTypes": ["image/jpeg", "image/png", "image/webp"]
      }
    },
    {
      "id": "agent",
      "name": "agent",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    }
  ],
  "listRule": "",
  "viewRule": "",
  "createRule": "@request.auth.id != ''",
  "updateRule": "agent = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "agent = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

Learning Management System

Courses Collection

{
  "id": "courses",
  "name": "Courses",
  "type": "base",
  "schema": [
    {
      "id": "title",
      "name": "title",
      "type": "text",
      "required": true,
      "options": {
        "min": 1,
        "max": 200
      }
    },
    {
      "id": "description",
      "name": "description",
      "type": "text",
      "options": {}
    },
    {
      "id": "instructor",
      "name": "instructor",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "price",
      "name": "price",
      "type": "number",
      "options": {
        "min": 0
      }
    },
    {
      "id": "thumbnail",
      "name": "thumbnail",
      "type": "file",
      "options": {
        "maxSelect": 1,
        "maxSize": 5242880,
        "mimeTypes": ["image/jpeg", "image/png", "image/webp"]
      }
    },
    {
      "id": "category",
      "name": "category",
      "type": "relation",
      "options": {
        "collectionId": "categories",
        "cascadeDelete": false,
        "maxSelect": 1
      }
    },
    {
      "id": "is_published",
      "name": "is_published",
      "type": "bool",
      "required": true
    }
  ],
  "listRule": "is_published = true",
  "viewRule": "is_published = true",
  "createRule": "@request.auth.id != ''",
  "updateRule": "instructor = @request.auth.id || @request.auth.id = 'ADMIN_ID'",
  "deleteRule": "instructor = @request.auth.id || @request.auth.id = 'ADMIN_ID'"
}

Enrollments Collection

{
  "id": "enrollments",
  "name": "Enrollments",
  "type": "base",
  "schema": [
    {
      "id": "student",
      "name": "student",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "users",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    },
    {
      "id": "course",
      "name": "course",
      "type": "relation",
      "required": true,
      "options": {
        "collectionId": "courses",
        "cascadeDelete": true,
        "maxSelect": 1
      }
    },
    {
      "id": "progress",
      "name": "progress",
      "type": "number",
      "required": true,
      "options": {
        "min": 0,
        "max": 100
      }
    },
    {
      "id": "status",
      "name": "status",
      "type": "select",
      "required": true,
      "options": {
        "values": ["enrolled", "in_progress", "completed", "dropped"]
      }
    }
  ],
  "listRule": "student = @request.auth.id",
  "viewRule": "student = @request.auth.id",
  "createRule": "student = @request.auth.id",
  "updateRule": "student = @request.auth.id",
  "deleteRule": "student = @request.auth.id"
}