Chuyển đến nội dung chính

CREATE TABLE trong SQL: Nắm vững thiết kế lược đồ và các thực tiễn tốt nhất

Hiểu cách CREATE TABLE định hình cơ sở dữ liệu của bạn. Học cú pháp chính, kiểu dữ liệu, ràng buộc và kỹ thuật tối ưu hóa để xây dựng lược đồ có khả năng mở rộng.
· 7 phút đọc

Khám phá cùng AI

Câu lệnh CREATE TABLE là nền tảng của mọi thiết kế cơ sở dữ liệu quan hệ. Nó xác định dữ liệu bạn lưu trữ, cách cấu trúc và các quy tắc đảm bảo tính chính xác.

Trong hướng dẫn này, tôi sẽ đưa bạn đi qua những yếu tố thiết yếu của cú pháp CREATE TABLE, các lựa chọn thiết kế thực tiễn, và ví dụ thực tế để giúp bạn tạo các bảng trực quan, hiệu quả, đáp ứng nhu cầu hiện tại và cả tăng trưởng trong tương lai.

Nếu bạn mới bắt đầu với SQL, hãy cân nhắc bắt đầu với khóa học Introduction to SQL hoặc khóa Intermediate SQL để xây dựng nền tảng vững chắc. Ngoài ra, tôi thấy SQL Basics Cheat Sheet mà bạn có thể tải về là một tài liệu tham khảo hữu ích vì nó có tất cả các hàm SQL thông dụng nhất.

Vai trò của CREATE TABLE trong thiết kế cơ sở dữ liệu

Câu lệnh CREATE TABLE là lệnh Ngôn ngữ Định nghĩa Dữ liệu (DDL) cốt lõi định nghĩa cách dữ liệu của bạn được lưu trữ, tổ chức và truy cập. Trước khi viết, bạn nên quyết định bảng đại diện cho điều gì, cách nó liên kết với các bảng khác, và cấu trúc của nó sẽ hỗ trợ các truy vấn trong tương lai như thế nào. 

Cú pháp cơ bản gồm tên bảng theo sau là danh sách cột, mỗi cột được định nghĩa với một kiểu dữ liệu và các ràng buộc tùy chọn. Xem cú pháp dưới đây:

-- Create table syntax
CREATE TABLE schema_name.table_name (
    column_name data_type constraint,
    column_name data_type constraint,
    column_name data_type constraint,
    ...
);

Trong đó:

  • schema_name: Không gian tên tùy chọn để tổ chức các bảng.

  • table_name: Tên rõ ràng, mô tả cho thực thể.

  • column_name: Tên của một trường (thuộc tính) trong bảng.

  • data_type: Định nghĩa định dạng, như INT, VARCHAR, hoặc DATE.

  • constraint: Các quy tắc tùy chọn như PRIMARY KEY, NOT NULL, hoặc UNIQUE.

Cú pháp này nhất quán trên các nền tảng SQL lớn như MySQL, PostgreSQL và SQL Server, chỉ khác biệt nhỏ về phương ngữ ở các tùy chọn nâng cao. Do đó, bạn nên tuân thủ quy ước đặt tên rõ ràng cho tên bảng và cột để duy trì tính nhất quán trên các nền tảng này.

Định nghĩa cột, kiểu dữ liệu và ràng buộc

Sau khi đã xem cách tạo cấu trúc bảng, hãy xem cách định nghĩa các cột định hình dữ liệu. Một định nghĩa cột gồm ba thành phần: tên cột, kiểu dữ liệu và các ràng buộc.

Chọn đúng kiểu dữ liệu giúp tối ưu lưu trữ và hiệu năng truy vấn, như dùng INT cho ID số hoặc VARCHAR cho văn bản độ dài thay đổi. Các lựa chọn kém, như dùng kiểu dữ liệu lớn không cần thiết, có thể gây lãng phí dung lượng và làm chậm truy vấn.

Ràng buộc thực thi các quy tắc giữ cho dữ liệu của bạn đáng tin cậy và liên kết. Ví dụ, PRIMARY KEY nhận diện duy nhất mỗi hàng, và FOREIGN KEY liên kết các bảng để duy trì mối quan hệ. Ràng buộc DEFAULT đặt giá trị tự động, trong khi CHECK đảm bảo các giá trị đáp ứng tiêu chí cụ thể. 

Xem ví dụ dưới đây, thể hiện các ràng buộc và kiểu dữ liệu được định nghĩa tốt. 

-- Create table syntax with data types and constraints defined
CREATE TABLE orders (
    order_id INT PRIMARY KEY,          -- Proper PK
    user_id INT NOT NULL,              -- Required relationship
    total DECIMAL(10,2) NOT NULL,      -- Exact monetary value
    status VARCHAR(20) DEFAULT 'new',  -- Controlled default
    FOREIGN KEY (user_id) REFERENCES users(user_id)  -- Enforce relationship
);

Truy vấn sau minh họa một ví dụ thiết kế bảng kém, nơi thiếu khóa và ràng buộc, kiểu dữ liệu quá cỡ và lựa chọn dữ liệu không chính xác có thể dẫn đến lưu trữ không nhất quán hoặc kém hiệu quả.

CREATE TABLE orders (
    id VARCHAR(50),        -- Unnecessary string PK
    user VARCHAR(255),     -- No relationship enforced
    total FLOAT,           -- Risky for money calculations
    status TEXT            -- No constraints or defaults
);

Là một thực hành tốt, hãy luôn đảm bảo bạn xác định rõ kiểu dữ liệu và ràng buộc theo thiết kế bảng và yêu cầu nghiệp vụ của mình.

Tôi khuyên bạn tham gia khóa Introduction to Relational Databases in SQL để học cách tạo bảng, áp đặt mối quan hệ và ràng buộc giữa các bảng.

Thiết kế bảng cho các kịch bản thực tế

Khi bạn đã hiểu cú pháp CREATE TABLE, tôi sẽ chỉ cho bạn cách thiết kế các bảng phù hợp với quy trình làm việc thực tế. 

Ví dụ thương mại điện tử

Giả sử bạn muốn tạo một hệ thống thương mại điện tử. Bạn sẽ có các bảng customers, orders và products với khóa ngoại liên kết các bảng này để thực thi quan hệ và tính toàn vẹn tham chiếu.

Đầu tiên, bạn sẽ tạo bảng customers với lược đồ sau để lưu hồ sơ người dùng:

-- Create customers table to store user profiles
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,               
    name VARCHAR(150) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

Tiếp theo, bảng products sẽ có lược đồ sau để lưu từng mặt hàng trên nền tảng.

-- Create products table for catalog of items for sale
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    price DECIMAL(10,2) NOT NULL,               -- Accurate money type
    stock INT CHECK (stock >= 0),               -- Prevent negative inventory
    created_at TIMESTAMP DEFAULT NOW()
);

Cuối cùng, bạn sẽ có bảng orders để lưu các giao dịch mua của khách hàng.

-- Create orders table
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NOT NULL,                   -- Link order → customer
    order_date TIMESTAMP DEFAULT NOW(),
    total_amount DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    -- Enforce relationship and ensure customer exists
);

Khi tạo nhiều bảng, hãy luôn dùng ràng buộc FOREIGN KEY để thiết lập mối quan hệ giữa một cột ở bảng con và PRIMARY KEY ở bảng cha nhằm đảm bảo toàn vẹn tham chiếu. Trong ví dụ của chúng ta, mối quan hệ này đảm bảo bạn không thể có một đơn hàng cho khách hàng không tồn tại.

Bảng tạm thời so với bảng nhân bản

Đôi khi bạn có thể muốn tạo một bảng cho một trường hợp sử dụng nhanh hoặc để thử nghiệm một phép biến đổi dữ liệu mà không ảnh hưởng đến lược đồ đang chạy. Trong trường hợp đó, bạn có thể tạo bảng tạm thời hoặc bảng nhân bản. Hãy xem cách tạo từng loại:

  • Bảng tạm thời: Đây là các bảng sống ngắn, thường chỉ hiển thị với phiên cơ sở dữ liệu hiện tại, và sẽ tự động bị xóa khi phiên kết thúc. Chúng hữu ích cho các phép biến đổi dữ liệu phức tạp, xử lý dữ liệu nhiều bước, hoặc thử nghiệm. Truy vấn dưới đây minh họa cách tạo bảng tạm thời trong PostgreSQL.
-- Temporary copy for short-term analysis
CREATE TEMPORARY TABLE temp_sales AS
SELECT * FROM sales
WHERE sale_date >= CURRENT_DATE - INTERVAL '7 days';
  • Bảng nhân bản: Đây là các bản sao y hệt của bảng hiện có, bao gồm cả chỉ mục và ràng buộc. Chúng hữu ích cho các giao dịch nhạy cảm, nơi tính toàn vẹn dữ liệu phải được bảo toàn trong quá trình chỉnh sửa.
-- Create quick structural clone for testing or recovery
CREATE TABLE orders_backup AS
SELECT * FROM orders;

Chuẩn hóa và phi chuẩn hóa

Khi thiết kế bảng, cân bằng giữa chuẩn hóa và phi chuẩn hóa phụ thuộc vào trường hợp sử dụng cụ thể, khối lượng dữ liệu và mẫu truy vấn để tối ưu hiệu quả và khả năng bảo trì của hệ thống. Dưới đây là tóm tắt khi nào dùng mỗi phương pháp:

  • Chuẩn hóa: Phương pháp này chia nhỏ các bảng lớn thành các bảng nhỏ hơn có liên quan để mỗi phần dữ liệu không khóa chỉ được lưu một lần. Ưu điểm là tăng hiệu quả, giảm thiểu dư thừa và dễ bảo trì.
  • Phi chuẩn hóa: Phương pháp này bổ sung dư thừa một cách có chủ đích, như bao gồm tên khách hàng trên mỗi hàng đơn hàng. Cách này cải thiện hiệu năng đọc cho các yêu cầu báo cáo hoặc phân tích cụ thể, đặc biệt khi phép nối chậm.

Tối ưu hóa và tự động hóa việc tạo bảng

Khi bạn tạo các bảng cho cơ sở dữ liệu, hãy ghi nhớ hiệu năng và khả năng bảo trì trong tương lai. Từ kinh nghiệm dày dặn của tôi trong thiết kế cơ sở dữ liệu, tôi xem các kỹ thuật tối ưu sau là hữu ích:

  • Đánh chỉ mục: Thêm chỉ mục trên các cột thường dùng trong tìm kiếm giúp tăng tốc truy vấn. Khi bạn định nghĩa PRIMARY KEY, nó tự động tạo một chỉ mục duy nhất.
  • Phân vùng: Đối với các bảng lớn, phân vùng chia dữ liệu thành các phần nhỏ, dễ quản lý dựa trên tiêu chí như ngày tháng, giúp nâng cao hiệu quả truy vấn bằng cách giới hạn phạm vi quét.
  • Cột tính toán: Một số cơ sở dữ liệu như SQL Server và PostgreSQL cho phép bạn định nghĩa cột tính toán, động tính giá trị từ các cột khác. Cách tiếp cận này có thể giảm lưu trữ dữ liệu dư thừa và cải thiện tốc độ truy vấn.

Trong quy trình hiện đại, tự động hóa đóng vai trò quan trọng trong thiết kế và quản lý lược đồ. Bạn có thể dựa vào các công cụ và truy vấn sau để lập tài liệu, sao chép hoặc tự động hóa quy trình:

Công cụ/Phương pháp

Mục đích

Ứng dụng ví dụ

pg_dump/ Sao lưu cơ sở dữ liệu

Dùng để tạo script CREATE TABLE từ một cơ sở dữ liệu hiện có.

Nhân bản môi trường sản xuất để thử nghiệm hoặc di chuyển.

Truy vấn Information Schema

Truy vấn trực tiếp các view tích hợp sẵn của cơ sở dữ liệu INFORMATION_SCHEMA.COLUMNS để lấy siêu dữ liệu lược đồ.

Tự động hóa tài liệu hoặc tạo mã ứng dụng động dựa trên định nghĩa cột.

Hàm SQL/Stored Procedure

Viết các thủ tục cơ sở dữ liệu kiểm tra xem bảng có tồn tại không, xóa nó, rồi tạo lại (thường gọi là mẫu IF EXISTS / CREATE TABLE).

Tự động hóa triển khai hoặc script thiết lập

Để lập kế hoạch trực quan, bạn có thể dùng các công cụ GUI, chẳng hạn như pgAdmin, MySQL Workbench hoặc SQL Server Management Studio, để tạo DDL script, vẽ sơ đồ quan hệ và cải thiện cộng tác giữa các thành viên kỹ thuật và không kỹ thuật.

Lỗi thường gặp và thực tiễn tốt nhất

Thiết kế các bảng hiệu quả và dễ bảo trì trong SQL giúp cơ sở dữ liệu của bạn hoạt động tối ưu. Dưới đây là các mẹo tôi khuyến nghị khi tạo bảng trong SQL: 

  • Chuẩn hóa quá mức: Chia bảng thành quá nhiều phần nhỏ có thể làm phức tạp phép nối và làm chậm truy vấn, trong khi chuẩn hóa chưa đủ có thể dẫn đến dư thừa dữ liệu. Để tránh điều này, hãy luôn bắt đầu với 3NF, sau đó chỉ phi chuẩn hóa cho các bảng báo cáo cụ thể nơi bạn ưu tiên tốc độ đọc hơn sự đơn giản khi cập nhật.

  • Thiết kế ràng buộc kém: Không định nghĩa ràng buộc, như thiếu khóa ngoại, có thể dẫn đến bản ghi mồ côi hoặc dữ liệu không nhất quán khó dọn dẹp. Luôn chỉ định chỉ mục trên mọi cột đóng vai trò FOREIGN KEY để đảm bảo phép nối nhanh.

  • Đặt tên rõ ràng và tài liệu hóa: Luôn sử dụng tên bảng và cột có tính mô tả, dễ đoán. Duy trì nhật ký thay đổi đơn giản cho cập nhật lược đồ và tránh dùng viết tắt mà các nhà phát triển sau này có thể không hiểu.

  • Quyền hạn và cân nhắc bảo mật: Khi thiết kế bảng cho môi trường sản xuất, chỉ cấp các quyền cần thiết, như tạo, sửa đổi hoặc xóa bảng, và tách quyền đọc/ghi để bảo vệ dữ liệu quan trọng. Ngoài ra, triển khai kiểm soát ở cấp lược đồ và nhật ký kiểm toán để theo dõi thay đổi, ngăn truy cập trái phép đồng thời đảm bảo tuân thủ và an ninh dữ liệu.

Kết luận

Với những tiến bộ trên các nền tảng đám mây, câu lệnh CREATE TABLE ngày càng linh hoạt hơn. Giờ đây, các công cụ tự động hóa và tính năng serverless đơn giản hóa việc quản lý lược đồ và di trú. Tôi khuyến nghị khám phá các chủ đề như khung di trú lược đồ (Flyway, Liquibase), mô hình hóa theo chiều (dimensional modeling), và các chiến lược chuẩn hóa/phi chuẩn hóa nâng cao để giúp bạn xây dựng cơ sở dữ liệu có khả năng mở rộng.

Tôi cũng khuyên bạn tham gia khóa Database Design, nơi bạn sẽ học cách tạo và quản lý cơ sở dữ liệu và chọn DBMS phù hợp với nhu cầu. Cuối cùng, hãy thử lộ trình nghề nghiệp Associate Data Engineer in SQL để học các nền tảng của kỹ thuật dữ liệu và kho dữ liệu. 

Allan Ouko

Tác giả

Allan Ouko

Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

Làm sao tôi tạo mối quan hệ giữa các bảng?

Sử dụng ràng buộc FOREIGN KEY tham chiếu đến các cột ở bảng khác.

Tôi có thể tạo bảng dựa trên cấu trúc của một bảng khác không?

Có, bạn có thể dùng câu lệnh CREATE TABLE AS SELECT để nhân bản cấu trúc và tùy chọn cả dữ liệu từ một bảng hiện có.

Sự khác biệt giữa bảng tạm thời và bảng thường là gì?

Bảng tạm thời chỉ tồn tại trong một phiên hoặc giao dịch, trong khi bảng thường tồn tại lâu dài trong cơ sở dữ liệu.

Tại sao tôi nên đánh chỉ mục các cột dùng trong ràng buộc FOREIGN KEY?

Bạn nên đánh chỉ mục các cột để tăng tốc các phép nối giữa bảng cha và bảng con.

Chủ đề

Liên quan