Home > Blog > tech

Turso และ Edge Database คืออะไร? ฐานข้อมูลบน Edge สำหรับ App ที่ต้องการ Low Latency 2026

turso edge database guide
Turso Edge Database Guide 2026
2026-04-10 | tech | 3500 words

ในยุคที่แอปพลิเคชันต้องรองรับผู้ใช้จากทั่วโลก ปัญหาหนึ่งที่นักพัฒนาพบเสมอคือ Latency ของฐานข้อมูล ไม่ว่า Backend จะเร็วแค่ไหน ถ้าฐานข้อมูลอยู่ที่ US East แต่ผู้ใช้อยู่เอเชียตะวันออกเฉียงใต้ Query ก็ต้องวิ่งข้ามมหาสมุทรแปซิฟิกไปกลับ ทำให้เกิด Latency สูง 200-400ms ต่อ Request ซึ่งส่งผลเสียต่อประสบการณ์ผู้ใช้อย่างมาก

Edge Database คือแนวคิดที่ย้ายฐานข้อมูลไปอยู่ใกล้ผู้ใช้มากที่สุด เหมือนกับที่ CDN ทำกับไฟล์ Static แต่คราวนี้ทำกับข้อมูลที่ Query ได้จริง และ Turso คือหนึ่งในผู้เล่นหลักที่กำลังปฏิวัติวงการ Edge Database ในปี 2026 บทความนี้จะพาคุณเข้าใจ Edge Database ตั้งแต่พื้นฐานจนถึงการนำไปใช้งานจริง

Edge Database คืออะไร?

Edge Database คือฐานข้อมูลที่ถูกออกแบบให้ทำงานบน Edge Network หรือเครือข่ายที่กระจายอยู่ตามภูมิภาคต่างๆ ทั่วโลก แทนที่จะมีฐานข้อมูลเพียงจุดเดียวใน Data Center เดียว Edge Database จะสร้าง Replica หรือสำเนาของข้อมูลไว้ที่ Edge Location ต่างๆ ทำให้ผู้ใช้สามารถอ่านข้อมูลจากจุดที่ใกล้ตัวเองมากที่สุด

แนวคิดนี้คล้ายกับ Content Delivery Network (CDN) ที่เก็บสำเนาไฟล์ Static ไว้ทั่วโลก แต่ Edge Database ไปไกลกว่านั้นเพราะรองรับการ Query ข้อมูลแบบ Dynamic ได้ ไม่ใช่แค่ Serve ไฟล์คงที่ ผู้ใช้ที่กรุงเทพฯ จะ Query ข้อมูลจาก Replica ที่สิงคโปร์ (ใกล้สุด) แทนที่จะวิ่งไปถึง Virginia

ข้อดีของ Edge Database

Turso คืออะไร?

Turso คือ Edge Database ที่สร้างจาก libSQL ซึ่งเป็น Open Source Fork ของ SQLite โดย Turso ได้ขยายความสามารถของ SQLite ให้รองรับการทำงานแบบ Client-Server, Replication และ Multi-tenancy ที่ SQLite ปกติทำไม่ได้ Turso ก่อตั้งโดย Glauber Costa และทีมที่มีประสบการณ์ด้าน Database Internals อย่างลึกซึ้ง

libSQL คืออะไร?

libSQL คือ Fork ของ SQLite ที่ Turso สร้างขึ้นเพื่อเพิ่มฟีเจอร์ที่ SQLite ไม่มี เนื่องจาก SQLite เป็นโปรเจกต์ที่ไม่รับ Contribution จากภายนอก (ควบคุมโดย D. Richard Hipp คนเดียว) ทีม Turso จึงตัดสินใจ Fork ออกมาเพื่อเพิ่มความสามารถ:

สถาปัตยกรรมของ Turso

Turso ใช้สถาปัตยกรรมที่เรียกว่า Embedded Replicas ซึ่งเป็นจุดเด่นสำคัญ:

# สถาปัตยกรรม Turso
# ┌─────────────────────────────────────────────────┐
# │            Primary Database (Write)              │
# │           เช่น Region: US East                   │
# └──────────┬──────────┬──────────┬────────────────┘
#            │          │          │  Replication
#     ┌──────▼──┐ ┌─────▼───┐ ┌───▼──────┐
#     │ Replica │ │ Replica │ │ Replica  │
#     │ Asia    │ │ Europe  │ │ S.America│
#     └─────────┘ └─────────┘ └──────────┘
#
# Embedded Replica:
# ┌──────────────────────────────────┐
# │  Your App Server / Edge Function │
# │  ┌────────────────────────────┐  │
# │  │  Embedded SQLite Replica   │  │
# │  │  (Local File / In-Memory)  │  │
# │  └────────────────────────────┘  │
# │  Reads: Local (0ms!)             │
# │  Writes: Forward to Primary     │
# └──────────────────────────────────┘

ข้อดีของ Embedded Replica คือการอ่านข้อมูลจะเกิดขึ้นบน Local SQLite File ในเครื่องเดียวกับ Application ทำให้ Read Latency แทบจะเป็น 0ms ส่วนการเขียนจะถูก Forward ไปยัง Primary Database แล้ว Replicate กลับมาอัพเดท Local Replica

เริ่มต้นใช้งาน Turso

# ติดตั้ง Turso CLI
curl -sSfL https://get.tur.so/install.sh | bash

# Login
turso auth login

# สร้าง Database
turso db create my-app-db

# สร้าง Database ที่ Region เฉพาะ
turso db create my-app-db --location sin  # Singapore

# ดู Database ทั้งหมด
turso db list

# สร้าง Replica ที่ Region อื่น
turso db replicate my-app-db nrt  # Tokyo (Narita)
turso db replicate my-app-db hkg  # Hong Kong

# สร้าง Auth Token
turso db tokens create my-app-db

# เข้า Shell
turso db shell my-app-db

ใช้ Turso กับ JavaScript/TypeScript

// ติดตั้ง
// npm install @libsql/client

import { createClient } from "@libsql/client";

// Remote connection
const client = createClient({
  url: "libsql://my-app-db-username.turso.io",
  authToken: process.env.TURSO_AUTH_TOKEN,
});

// Query
const result = await client.execute("SELECT * FROM users WHERE id = ?", [1]);
console.log(result.rows);

// Insert
await client.execute({
  sql: "INSERT INTO users (name, email) VALUES (?, ?)",
  args: ["somchai", "somchai@example.com"],
});

// Transaction
await client.transaction(async (tx) => {
  await tx.execute("UPDATE accounts SET balance = balance - 100 WHERE id = ?", [1]);
  await tx.execute("UPDATE accounts SET balance = balance + 100 WHERE id = ?", [2]);
});

// Batch (หลาย Statement ใน 1 Round-trip)
await client.batch([
  { sql: "INSERT INTO logs (msg) VALUES (?)", args: ["action1"] },
  { sql: "INSERT INTO logs (msg) VALUES (?)", args: ["action2"] },
]);

Embedded Replica ใน Application

import { createClient } from "@libsql/client";

// Embedded Replica — อ่านจาก Local, เขียนไป Primary
const client = createClient({
  url: "file:local-replica.db",           // Local SQLite file
  syncUrl: "libsql://my-app-db-user.turso.io",  // Primary
  authToken: process.env.TURSO_AUTH_TOKEN,
  syncInterval: 60,  // Sync ทุก 60 วินาที
});

// Manual sync
await client.sync();

// Read — จาก Local file (เร็วมาก!)
const users = await client.execute("SELECT * FROM users");

// Write — Forward ไป Primary แล้ว Sync กลับ
await client.execute("INSERT INTO users (name) VALUES (?)", ["new user"]);
Embedded Replica เหมาะมากสำหรับ: Read-heavy applications ที่ต้องการ Read Latency ต่ำมาก เช่น E-commerce Product Catalog, Content Management, Configuration Store สิ่งสำคัญคือต้องยอมรับ Eventual Consistency สำหรับ Read ได้

Turso กับ Drizzle ORM

Drizzle ORM เป็น TypeScript ORM ที่ได้รับความนิยมสูงในปี 2026 และรองรับ Turso/libSQL อย่างเต็มรูปแบบ:

// drizzle.config.ts
import type { Config } from "drizzle-kit";

export default {
  schema: "./src/db/schema.ts",
  out: "./drizzle",
  dialect: "turso",
  dbCredentials: {
    url: process.env.TURSO_DATABASE_URL!,
    authToken: process.env.TURSO_AUTH_TOKEN!,
  },
} satisfies Config;

// src/db/schema.ts
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const users = sqliteTable("users", {
  id: integer("id").primaryKey({ autoIncrement: true }),
  name: text("name").notNull(),
  email: text("email").notNull().unique(),
  createdAt: text("created_at").default("CURRENT_TIMESTAMP"),
});

export const posts = sqliteTable("posts", {
  id: integer("id").primaryKey({ autoIncrement: true }),
  title: text("title").notNull(),
  content: text("content"),
  authorId: integer("author_id").references(() => users.id),
});

// src/db/index.ts
import { drizzle } from "drizzle-orm/libsql";
import { createClient } from "@libsql/client";
import * as schema from "./schema";

const client = createClient({
  url: process.env.TURSO_DATABASE_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN!,
});

export const db = drizzle(client, { schema });

// การใช้งาน
const allUsers = await db.select().from(schema.users);
const userPosts = await db.query.users.findMany({
  with: { posts: true },
});

เปรียบเทียบ Edge Database: Turso vs PlanetScale vs Neon vs Supabase

FeatureTursoPlanetScaleNeonSupabase
EnginelibSQL (SQLite)Vitess (MySQL)PostgreSQLPostgreSQL
Edge ReplicasYes (Embedded)No (ปิดตัว)Read ReplicasRead Replicas
ServerlessNativeNativeYes (Branching)Partial
Free Tier9 GB, 500 DBปิดบริการ512 MB500 MB
Latency (Edge)<1ms (Embedded)N/A~50-100ms~50-150ms
BranchingNoYesYesNo
Multi-tenantNative (1 DB/tenant)NoNoRow Level Security
ProtocolHTTP/WebSocketMySQLPostgreSQL/HTTPPostgreSQL/HTTP
PlanetScale หยุดให้บริการ Free Tier ในปี 2024 และหลายทีมย้ายไป Turso หรือ Neon แทน ในปี 2026 Turso กลายเป็นตัวเลือกอันดับต้นสำหรับ Edge Database โดยเฉพาะถ้าต้องการ Embedded Replica

Cloudflare D1 — Edge Database จาก Cloudflare

D1 คือ Serverless SQL Database จาก Cloudflare ที่ทำงานบน Edge Network ของ Cloudflare เช่นกัน D1 ก็ใช้ SQLite เป็น Engine เบื้องหลัง เหมาะสำหรับใช้คู่กับ Cloudflare Workers

// wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "my-d1-db"
database_id = "xxxx-xxxx-xxxx"

// Cloudflare Worker with D1
export default {
  async fetch(request, env) {
    const { results } = await env.DB.prepare(
      "SELECT * FROM products WHERE category = ?"
    ).bind("electronics").all();

    return Response.json(results);
  },
};

// Migration
// wrangler d1 migrations create my-d1-db init
// wrangler d1 migrations apply my-d1-db

D1 มีข้อจำกัดคือทำงานได้เฉพาะใน Cloudflare Workers ecosystem เท่านั้น ไม่สามารถเชื่อมต่อจากภายนอก Cloudflare ได้โดยตรง ต่างจาก Turso ที่ใช้ได้จากทุกที่ แต่ถ้าคุณอยู่ใน Cloudflare ecosystem อยู่แล้ว D1 เป็นตัวเลือกที่สะดวกมาก

LiteFS — SQLite Replication จาก Fly.io

LiteFS เป็น FUSE-based filesystem จาก Fly.io ที่ทำให้ SQLite สามารถ Replicate ข้ามหลาย Node ได้ LiteFS ทำงานที่ระดับ Filesystem โดยจับ Write ที่เกิดขึ้นกับ SQLite file แล้ว Replicate ไปยัง Node อื่น

# litefs.yml
fuse:
  dir: "/litefs"

data:
  dir: "/var/lib/litefs"

lease:
  type: "consul"
  advertise-url: "http://$HOSTNAME:20202"
  consul:
    url: "http://consul:8500"
    key: "litefs/primary"

exec:
  - cmd: "node server.js"

# Application ใช้ SQLite ที่ /litefs/db ตามปกติ
# LiteFS จัดการ Replication ให้โปร่งใส

ข้อดีของ LiteFS คือ Application ไม่ต้องเปลี่ยน Code เลย ใช้ SQLite driver ปกติ LiteFS จัดการ Replication ให้ที่ระดับ Filesystem แต่ข้อเสียคือต้อง Deploy บน Fly.io หรือจัดการ FUSE mount เอง

DuckDB สำหรับ Analytics ที่ Edge

DuckDB คือ Analytical Database ที่ออกแบบมาสำหรับ OLAP (Online Analytical Processing) ทำงานแบบ Embedded เหมือน SQLite แต่เชี่ยวชาญด้าน Analytics Query เช่น Aggregation, Window Functions, Columnar Storage

// DuckDB สำหรับ Edge Analytics
import { Database } from "duckdb-async";

const db = await Database.create(":memory:");

// โหลดข้อมูลจาก Parquet บน S3
await db.run(`
  CREATE TABLE sales AS
  SELECT * FROM read_parquet('s3://bucket/sales-2026-*.parquet')
`);

// Analytical Query
const result = await db.all(`
  SELECT
    region,
    DATE_TRUNC('month', sale_date) as month,
    SUM(amount) as total_sales,
    COUNT(*) as num_transactions,
    AVG(amount) as avg_sale
  FROM sales
  GROUP BY region, month
  ORDER BY total_sales DESC
`);

DuckDB ไม่ใช่ Edge Database โดยตรง แต่สามารถใช้ที่ Edge สำหรับ Analytics ได้ เช่น ฝัง DuckDB ใน Edge Function แล้วให้มัน Query Parquet Files จาก S3 ทำให้ได้ Analytics ที่ Edge โดยไม่ต้องส่ง Query กลับไป Central Data Warehouse

เมื่อไหร่ที่ Edge Database เหมาะสม?

เหมาะสม (Use Cases ที่ดี)

ไม่เหมาะสม (ใช้ Central DB แทน)

Edge Database Patterns

Pattern 1: Read Replicas ที่ Edge

// อ่านจาก Edge Replica, เขียนไป Primary
const readClient = createClient({
  url: "file:./local.db",
  syncUrl: "libsql://primary.turso.io",
  authToken: TOKEN,
});

const writeClient = createClient({
  url: "libsql://primary.turso.io",
  authToken: TOKEN,
});

// Read path — Local (fast)
app.get("/products/:id", async (req, res) => {
  const product = await readClient.execute(
    "SELECT * FROM products WHERE id = ?", [req.params.id]
  );
  res.json(product.rows[0]);
});

// Write path — Primary (consistent)
app.post("/orders", async (req, res) => {
  await writeClient.execute(
    "INSERT INTO orders (user_id, product_id, qty) VALUES (?, ?, ?)",
    [req.body.userId, req.body.productId, req.body.qty]
  );
  await readClient.sync(); // Sync ทันทีหลัง write
  res.json({ success: true });
});

Pattern 2: Database per Tenant

// Turso รองรับ Database จำนวนมาก (Free tier: 500 DBs)
// สร้าง 1 DB ต่อ 1 Tenant

async function getTenantClient(tenantId: string) {
  return createClient({
    url: `libsql://${tenantId}-myapp.turso.io`,
    authToken: process.env.TURSO_GROUP_TOKEN,
  });
}

app.use(async (req, res, next) => {
  const tenantId = req.headers["x-tenant-id"];
  req.db = await getTenantClient(tenantId);
  next();
});

app.get("/data", async (req, res) => {
  const result = await req.db.execute("SELECT * FROM data");
  res.json(result.rows);
});

Pattern 3: Multi-Region with Conflict Awareness

// สำหรับ App ที่ต้อง Write จากหลาย Region
// ใช้ Conflict-free Strategy

// Approach 1: Route Write ไป Primary เสมอ
// ง่ายที่สุด ไม่มี Conflict แต่ Write Latency สูง

// Approach 2: Last-Write-Wins (LWW)
// ใช้ Timestamp ตัดสิน
const insertWithLWW = `
  INSERT INTO settings (key, value, updated_at)
  VALUES (?, ?, datetime('now'))
  ON CONFLICT(key) DO UPDATE SET
    value = excluded.value,
    updated_at = excluded.updated_at
  WHERE excluded.updated_at > settings.updated_at
`;

// Approach 3: CRDT-style Counters
// สำหรับ Counter ที่ต้อง Increment จากหลาย Region
// เก็บ Delta แทน Absolute Value

Consistency Models ที่ Edge

ความเข้าใจเรื่อง Consistency Model เป็นสิ่งสำคัญมากเมื่อใช้ Edge Database เพราะข้อมูลที่อ่านจาก Replica อาจไม่ตรงกับ Primary เสมอไป:

Modelคำอธิบายใช้กับ
Strong Consistencyอ่านได้ข้อมูลล่าสุดเสมอPrimary DB โดยตรง
Eventual Consistencyข้อมูลจะตรงกันในที่สุด อาจมี DelayEdge Replicas ทั่วไป
Bounded Stalenessข้อมูลเก่าไม่เกิน X วินาทีTurso (sync interval)
Read-Your-Writesเห็นข้อมูลที่ตัวเองเขียนเสมอTurso (sync after write)
// ตัวอย่าง: Read-Your-Writes Consistency
async function writeAndRead(data) {
  // 1. Write ไป Primary
  await primaryClient.execute(
    "INSERT INTO items (name) VALUES (?)", [data.name]
  );

  // 2. Sync Replica ทันที
  await replicaClient.sync();

  // 3. Read จาก Replica — จะเห็นข้อมูลที่เพิ่งเขียน
  const result = await replicaClient.execute(
    "SELECT * FROM items ORDER BY id DESC LIMIT 1"
  );
  return result.rows[0];
}

Edge Database สำหรับ Next.js และ Nuxt

Next.js + Turso

// app/api/products/route.ts (Next.js App Router)
import { createClient } from "@libsql/client/web";

const db = createClient({
  url: process.env.TURSO_DATABASE_URL!,
  authToken: process.env.TURSO_AUTH_TOKEN!,
});

// Edge Runtime — ทำงานบน Edge Network ของ Vercel
export const runtime = "edge";

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const category = searchParams.get("category");

  const result = await db.execute({
    sql: "SELECT * FROM products WHERE category = ? ORDER BY name",
    args: [category],
  });

  return Response.json(result.rows);
}

Nuxt 3 + Turso

// server/utils/db.ts
import { createClient } from "@libsql/client/web";

let _db: ReturnType<typeof createClient>;

export function useDB() {
  if (!_db) {
    _db = createClient({
      url: useRuntimeConfig().tursoUrl,
      authToken: useRuntimeConfig().tursoToken,
    });
  }
  return _db;
}

// server/api/posts.get.ts
export default defineEventHandler(async () => {
  const db = useDB();
  const result = await db.execute("SELECT * FROM posts ORDER BY created_at DESC");
  return result.rows;
});

Pricing และ Free Tiers เปรียบเทียบ (2026)

ServiceFree TierPaid เริ่มต้นจุดเด่น
Turso9 GB, 500 DBs, 1B reads/mo$29/mo (Scaler)Embedded Replica, Multi-tenant
Cloudflare D15 GB, 5M reads/day$5/mo (Workers Paid)Cloudflare ecosystem
Neon512 MB, Auto-suspend$19/mo (Launch)Branching, PostgreSQL
Supabase500 MB, 50K requests$25/mo (Pro)Auth, Storage, Realtime
สำหรับ Side Project หรือ Startup: Turso Free Tier เป็นตัวเลือกที่ดีที่สุดในปี 2026 เพราะให้ 9 GB Storage และ 500 Databases ซึ่งเพียงพอสำหรับ Multi-tenant SaaS ขนาดเล็ก-กลาง และ Embedded Replica ทำให้ Read เร็วมากโดยไม่มีค่าใช้จ่ายเพิ่มเติม

ข้อจำกัดของ Edge Database

Write Patterns

ข้อจำกัดที่สำคัญที่สุดของ Edge Database คือ Write Operations เพราะ Write ต้อง Forward ไปยัง Primary เสมอ ทำให้ Write Latency ไม่ได้ลดลงเหมือน Read นอกจากนี้ SQLite ยังมีข้อจำกัดเรื่อง Concurrent Write (ใช้ WAL mode ได้ 1 Writer ต่อครั้ง)

Conflict Resolution

เมื่อมีหลาย Region เขียนข้อมูลพร้อมกัน อาจเกิด Conflict ได้ Edge Database ส่วนใหญ่ใช้ Last-Write-Wins (LWW) ซึ่งอาจทำให้ข้อมูลบางอย่างหายไป ถ้าต้องการ Conflict Resolution ที่ซับซ้อนกว่านี้ต้องจัดการเองที่ Application Layer

ข้อจำกัดของ SQLite ที่ Edge

อนาคตของ Edge Computing + Database

แนวโน้มในปี 2026 และอนาคตอันใกล้:

Edge Database ไม่ได้มาแทนที่ PostgreSQL หรือ MySQL แต่เป็นเครื่องมือเพิ่มเติมในชุดเครื่องมือของนักพัฒนา ถ้า Application ของคุณต้องการ Low Latency สำหรับ Read-heavy Workload ที่มีผู้ใช้ทั่วโลก Edge Database อย่าง Turso คือตัวเลือกที่ควรพิจารณาอย่างจริงจัง

สรุป

Edge Database เป็นวิวัฒนาการสำคัญของวงการฐานข้อมูลในปี 2026 โดย Turso ได้พิสูจน์แล้วว่า SQLite สามารถเป็น Production Database ระดับ Global ได้ด้วยสถาปัตยกรรม Embedded Replica และ libSQL การเลือกใช้ Edge Database ต้องพิจารณาจาก Read/Write Ratio ความต้องการ Consistency และ Geographic Distribution ของผู้ใช้ สำหรับนักพัฒนาที่กำลังสร้าง Global Application ด้วย Next.js, Nuxt หรือ Serverless Functions การรู้จักและเข้าใจ Edge Database จะช่วยให้คุณสร้าง Application ที่เร็วกว่าเดิมหลายเท่า

เริ่มต้นวันนี้ด้วย turso auth login แล้วสร้าง Database แรกของคุณ คุณจะประทับใจกับ Read Latency ที่ต่ำจนแทบจะเป็น 0ms ด้วย Embedded Replica


Back to Blog | iCafe Forex | SiamLanCard | Siam2R