Thiết kế Schema và tạo bảng trong Turso
Trong bước này, chúng ta sẽ định nghĩa cấu trúc dữ liệu cho ứng dụng quản lý sản phẩm và người dùng. Sử dụng Turso CLI để tạo bảng giúp đồng bộ schema ngay lập tức lên edge database mà không cần thông qua SQL server truyền thống.
Chúng ta sẽ tạo 2 bảng: users (lưu thông tin tài khoản) và products (lưu thông tin sản phẩm). Sử dụng kiểu dữ liệu INTEGER PRIMARY KEY để tối ưu hiệu năng tự động tăng (auto-increment) và TEXT cho các chuỗi ký tự.
Thực hiện lệnh tạo bảng bằng cách sử dụng turso db execute. Thay thế my-database và main bằng tên database và branch thực tế của bạn.
turso db execute my-database --branch main --sql "CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);"
Kết quả mong đợi: Turso CLI trả về thông báo thành công (thường là dòng rỗng hoặc 0 dòng bị ảnh hưởng nếu là lệnh DDL) và không có lỗi cú pháp.
Tiếp tục tạo bảng products với các trường liên kết quan hệ ngoại (foreign key) logic về phía bảng users.
turso db execute my-database --branch main --sql "CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
name TEXT NOT NULL,
price REAL NOT NULL,
stock INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);"
Kết quả mong đợi: Lệnh thực thi thành công, bảng products được tạo với ràng buộc ngoại khóa.
Verify kết quả tạo bảng
Để xác nhận các bảng đã tồn tại trong database, sử dụng lệnh list table của Turso.
turso table list my-database --branch main
Kết quả mong đợi: Đầu ra hiển thị danh sách các bảng bao gồm users và products.
Xây dựng chỉ mục (Index) tối ưu hiệu năng
Việc tạo index là bắt buộc khi dữ liệu tăng trưởng để đảm bảo các truy vấn tìm kiếm (SELECT) và join chạy nhanh. SQLite (Turso) sử dụng B-Tree, việc thiếu index trên các trường thường dùng để lọc (WHERE) sẽ gây quét toàn bộ bảng (full table scan).
Chúng ta sẽ tạo index cho trường email trong bảng users (để tìm kiếm đăng nhập nhanh) và trường user_id trong bảng products (để join nhanh lấy danh sách sản phẩm của user).
Thực hiện lệnh tạo index duy nhất cho email để đảm bảo không có 2 user có cùng email.
turso db execute my-database --branch main --sql "CREATE UNIQUE INDEX idx_users_email ON users(email);"
Kết quả mong đợi: Lệnh chạy thành công, chỉ mục idx_users_email được thêm vào schema.
Tạo index thường cho trường user_id trong bảng sản phẩm để tối ưu truy vấn "Lấy tất cả sản phẩm của một user".
turso db execute my-database --branch main --sql "CREATE INDEX idx_products_user_id ON products(user_id);"
Kết quả mong đợi: Lệnh chạy thành công, chỉ mục idx_products_user_id được tạo.
Verify kết quả tạo Index
Trong SQLite, lệnh .indexes thường dùng cho shell, nhưng với Turso CLI remote, ta dùng lệnh PRAGMA để kiểm tra.
turso db execute my-database --branch main --sql "PRAGMA index_list(users);"
Kết quả mong đợi: Hiển thị danh sách index của bảng users, bao gồm idx_users_email.
Nhập dữ liệu mẫu (Seed Data) từ file SQL
Để kiểm tra hiệu năng và cấu trúc, chúng ta cần dữ liệu mẫu. Cách an toàn và nhanh nhất trên Linux là chuẩn bị một file SQL chứa lệnh INSERT và dùng Turso CLI để execute file đó.
Đầu tiên, tạo file /tmp/seed_data.sql trên local machine chứa dữ liệu mẫu. File này sẽ chèn 3 người dùng và 5 sản phẩm.
cat > /tmp/seed_data.sql
Kết quả mong đợi: File /tmp/seed_data.sql được tạo thành công với nội dung SQL.
Sử dụng Turso CLI để đọc và thực thi toàn bộ nội dung file SQL vừa tạo. Lệnh này sẽ tự động đóng gói transaction để đảm bảo tính nguyên vẹn dữ liệu.
turso db execute my-database --branch main --file /tmp/seed_data.sql
Kết quả mong đợi: Turso CLI in ra số lượng dòng đã được chèn thành công (ví dụ: 8 dòng) hoặc thông báo Success.
Kiểm tra dữ liệu và cấu trúc bảng
Sau khi nhập dữ liệu, cần xác minh xem dữ liệu đã được lưu đúng và chỉ mục có hoạt động không. Chúng ta sẽ sử dụng lệnh SELECT để trích xuất dữ liệu và PRAGMA để kiểm tra schema.
Truy vấn bảng users để xem danh sách người dùng đã được tạo.
turso db execute my-database --branch main --sql "SELECT id, username, email FROM users;"
Kết quả mong đợi: Đầu ra dạng bảng (tabular) hiển thị 3 dòng dữ liệu tương ứng với alice, bob, charlie.
Thực hiện truy vấn join để kiểm tra mối quan hệ giữa users và products, đồng thời xác nhận index idx_products_user_id đang được sử dụng (thông qua EXPLAIN QUERY PLAN).
turso db execute my-database --branch main --sql "EXPLAIN QUERY PLAN SELECT p.name, u.username FROM products p JOIN users u ON p.user_id = u.id WHERE u.username = 'alice';"
Kết quả mong đợi: Đầu ra hiển thị kế hoạch thực thi, trong đó có dòng SEARCH products USING INDEX idx_products_user_id hoặc SEARCH users USING INDEX idx_users_email, chứng tỏ chỉ mục đang hoạt động hiệu quả.
Cuối cùng, liệt kê lại toàn bộ bảng và kiểm tra số lượng dòng để đảm bảo mọi thứ ổn định.
turso table list my-database --branch main
turso db execute my-database --branch main --sql "SELECT 'users' as table_name, COUNT(*) as row_count FROM users UNION ALL SELECT 'products', COUNT(*) FROM products;"
Kết quả mong đợi: Lệnh list hiển thị 2 bảng, và lệnh count trả về 3 cho users và 5 cho products.
Điều hướng series:
Mục lục: Series: Triển khai Database Serverless với Turso và SQLite trên Ubuntu 24.04
« Phần 3: Khởi tạo Database và tạo Branch đầu tiên
Phần 5: Kết nối ứng dụng với Turso qua SDK và LibSQL »