Định nghĩa dữ liệu

Định nghĩa dữ liệu
Định nghĩa dữ liệu

Trong bài viết này, chúng ta sẽ tìm hiểu cú pháp định nghĩa dữ liệu. Nhờ nó chúng ta có thể tạo Cơ Sở Dữ Liệu, bảng dữ liệu cũng như các ràng buộc toàn vẹn.

Thiết kế CSDL là một công việc phức tạp, đòi hỏi rất nhiều kỹ năng. Trong phạm vi loạt bài viết này, chúng ta tập trung vào việc truy vấn, rút trích dữ liệu. Do đó, mình sẽ không đi sâu về vấn đề này. Tuy nhiên, chúng ta cũng cần phải biết những cú pháp đơn giản trong việc khởi tạo CSDL và định nghĩa các bảng dữ liệu. Để có một cái nhìn khái quát hơn về cấu trúc của CSDL, bảng dữ liệu và các ràng buộc toàn vẹn (RBTV) trên CSDL của chúng ta.

Với CSDL mẫu, chúng ta sẽ thống nhất đặt tên nó là ‘Chinook‘. Vì phần import dữ liệu mình đã chuẩn bị sẵn cho các bạn. Do đó, các bạn cũng nên đặt tên theo chuẩn của mình đề xuất.

Tạo Cơ Sở Dữ Liệu

SQLServer cung cấp cho chúng ta cú pháp sau để khởi tạo một CSDL

Nhưng như đã giới thiệu phía trên, chúng ta không quá đặt nặng về vấn đề tạo và thiết kế CSDL. Do đó, chúng ta có thể tạo một CSDL bằng cú pháp đơn giản nhất.

Nếu bạn sử dụng Microsoft SQL Server Management Studio (SSMS) thì sau khi thực thi câu lệnh này; ở Object Explorer CSDL Chinook của chúng ta đã xuất hiện.

Tạo cơ sở dữ liệu
Tạo cơ sở dữ liệu

Sau khi đã tạo CSDL, việc kế tiếp là chỉ định cho SSMS biết Chinook là CSDL chúng ta muốn làm việc vào thời điểm hiện tại.

Cơ sở dữ liệu hiện tại
Cơ sở dữ liệu hiện tại

Ở trên thanh công cụ của SSMS, khu vực khoanh đỏ hiển thị CSDL mà chúng ta đang làm việc với. Trước các thao tác: ‘định nghĩa dữ liệu’, ‘cập nhật dữ liệu’ chúng ta sẽ cần chắc chắn rằng. Chúng ta đang thao tác đúng với CSDL.

Để chuyển đổi CSDL trong phiên làm việc. Chúng ta có 2 cách cơ bản.

  • Mở dropbox (khu vực khoanh đỏ trên hình), chọn CSDL chúng ta muốn thao tác
  • Sử dụng lệnh USE

Sau khi thực thi (execute) đoạn mã trên, bạn có thể thấy CSDL Chinook đã xuất hiện ở khu vực khoanh đỏ.

Tạo Và Cập Nhật Cấu Trúc Bảng

Sau khi có CSDL, chúng ta sẽ tạo các bảng dữ liệu bên trong CSDL. Các thao tác bao gồm việc tạo mới một bảng và cập nhật cấu trúc của các bảng đã tồn tại

Tạo mới một bảng

Trước khi bắt đầu, chúng ta sẽ tìm hiểu sơ qua hai khái niệm

Một cột dữ liệu

Cú pháp để định nghĩa một cột dữ liệu:

  • column_name: tên của cột dữ liệu, có độ dài từ 1 đến 128 ký tự.
  • data_type: kiểu dữ liệu của cột
  • column_constraint: RBTV cú pháp của RBTV được mô tả trong mục bên dưới. RBTV có thể khai báo trực tiếp với cột dữ liệu hoặc khai báo dán tiếp phía bên dưới.

Cú pháp khởi tạo ràng buộc toàn vẹn (Constraint) – RBTV

Dưới đây là cú pháp để định nghĩa một RBTV

Các loại ràng buộc toàn vẹn

  • NULL | NOT NULL: RBTV này quy định 1 thuộc tính lúc thêm mới/cập nhật được phép nhận giá trị NULL hay không
  • DEFAULT: RBTV này set giá trị mặc định cho một thuộc tính. Khi thêm mới, nếu giá trị của thuộc tính này không được đề cập, giá trị mặc định sẽ được tự động gán cho thuộc tính
  • PRIMARY KEY: RBTV này quy định 1 thuộc thuộc tính sẽ trở thành khóa chính của bảng. Và dĩ nhiên, khi một thuộc tính là khóa chính, nó sẽ được kèm theo tính chất duy nhất (UNIQUE).
  • UNIQUE: RBTV này quy định 1 thuộc tính này sẽ không có các giá trị trùng nhau. Ví dụ: Trong bảng quản lý sinh viên, chúng ta lưu trữ thêm thông tin email. Email không phải là khóa chính, nhưng chúng ta không muốn có 2 bạn sinh viên có email trùng nhau.
  • FOREIGN KEY: RBTV này quy định thuộc tính là khóa ngoại. Khi khai báo thuộc tính này, các bạn thấy một vài thông số cần lưu ý:
    • REFERENCES referenced_table_name(ref_column): Chỉ định bảng dữ liệu tham chiếu đến và thuộc tính được tham chiếu tại bảng đó.
    • ON DELETE/ ON UPDATE: quy định hành động của Database Engine khi người dùng thực hiện các thao tác cập nhật, xóa các dữ liệu liên kết. Ví dụ: bảng “Sinh Viên” có thuộc tính Mã_Lớp là khóa ngoại của bảng “Lớp”. Vậy Database Engine sẽ xử lý như thế nào khi chúng ta xóa một lớp học trong bảng ‘Lớp’:
      • NO ACTION: Đây là giá trị mặc định, DB Engine sẽ trả về một lỗi và không cho phép thực hiện thao tác
      • CASCADE: DB Engine sẽ xóa tất cả các giá trị phụ thuộc
      • SET NULL: DB Engine sẽ set giá trị NULL cho giá trị khóa ngoại
      • SET DEFAUL: DB Engine sẽ set giá trị mặc định cho khóa ngoại. Lựa chọn này chỉ hoạt động khi khóa ngoại được cài đặt giá trị mặc định
  • CHECK: RBTV này sẽ kiểm tra dữ liệu. Đảm bảo dữ liệu phải thỏa mãn các yêu cầu trong biểu thức.

Lưu ý: Nếu chưa biết, các bạn có thể tham khảo khái niệm khóa chính (primary key) và khóa ngoại (foreign key) tại bài viết: Một số khái niệm, thuật ngữ.

Tạo bảng

Cấu trúc T-SQL rất linh hoạt. Do đó, bạn có thể sẽ thấy rất nhiều phương pháp để khai báo một bảng dữ liệu mới. Tuy nhiên, để đồng bộ suốt loạt bài viết này, mình sẽ đưa ra một số quy ước chung để chúng ta dễ trao đổi.

  • Nếu bạn để ý những ví dụ từ đầu đến hiện tại, có lẽ bạn sẽ đoán được nguyên tắc số 1. Các từ khóa (CREATE, ALTER, DROP…vv) và kiểu dữ liệu (CHAR, INT, BIGINT…vv) luôn được viết in hoa.
  • Các RBTV chia làm 2 loại. Loại đơn giản và phức tạp. Đơn giản sẽ được khai báo cùng với khai báo thuộc tính. Các RBTV phức tạp sẽ được khai báo phía dưới cùng.
    • RBTV đơn giản bao gồm: NULL | NOT NULL, DEFAULT, UNIQUE
    • RBTV phức tạp: PRIMARY KEY, FOREIGN KEY, CHECK
  • RBTV khóa ngoại sẽ sử dụng cú pháp cập nhật cấu trúc được đề cập ở phần bên dưới để tránh lỗi.

Và dựa vào mô tả CSDL mẫu. Mình sẽ có một ví dụ cho các bạn.

Thật đơn giản đúng không nào? Vậy, bây giờ nhiệm vụ của các bạn là dựa vào mô tả CSDL mẫu để thực hành với 10 bảng còn lại.

Cập nhật cấu trúc một bảng

Thêm cột mới

Xóa một cột đã tồn tại

Cập nhật cấu trúc của cột

Thêm ràng buộc

Để minh họa cho ví dụ này, dựa trên những nguyên tắc quy ước. Chúng ta sẽ sử dụng cú pháp này để quy định các RBTV khóa ngoại. Bây giờ chúng ta sẽ khai báo một RBTV khóa ngoại là thuộc tính ArtistId trong bảng Album tham chiếu đến bảng Artist thông qua thuộc tính ArtistId

Cũng thật đơn giản đúng không các bạn. Các bạn hãy tiếp tục dựa trên mô tả CSDL, hoàn thiện tất cả các RBTV về khóa ngoại còn lại.

Xóa một ràng buộc

Các lưu ý

  • Đặt tên: Tên của các cột nếu chưa có sẵn, chúng ta cần nghĩ cho nó một cái tên hợp lý:
    • Không quá dài – tên của bảng hay cột quá dài sẽ gây khó khăn, phiền phức trong quá trình sử dụng
    • Không quá ngắn – một số trường hợp, các bạn rút gọn tên bằng cách viết tắt. Việc này giúp tăng tốc trong quá trình sử dụng. Nhưng bù lại, làm giảm ngữ nghĩa của bảng và cả CSDL
    • Không phát âm được – đôi lúc, chúng ta đặt một cái tên rất ý nghĩa (với riêng mình). Ví dụ: mình đặt một CSDL với tên HODI (viết tắt tên của mình). Về cơ bản, không có gì sai và xấu cả. Nhưng xét về mặt phát âm và ngữ nghĩa thì không được tốt lắm, về lâu dài có thể gây khó chịu cho những người làm chung
  •  Các thao tác cập nhật (update) bất cứ thông tin nào (tên cột, cấu trúc, RBTV) đều có thể dẫn đến các phản ứng dây chuyển (CSDL của chúng ta là CSDL quan hệ, giữa các bảng và cột có các mối quan hệ và ràng buộc). Do đó, trước khi thay đổi các thông tin, cần kiểm tra kỹ.

Hỗ trợ

Do CSDL của chúng ta tương đối lớn. Nên chúng ta sẽ cần sử dụng thêm một kỹ thuật index dữ liệu. Về ý nghĩa của kỹ thuật này, trong tương lai gần, mình sẽ có một bài viết giải thích chi tiết. Tuy nhiên, ở phạm vi bài hôm nay, các bạn chỉ cần thực thi đoạn mã bên dưới:

Nếu trong quá trình thực hiện, các bạn gặp lỗi. Đừng nản, vì ban đầu tiếp cận một lĩnh vực nào đó chúng ta đều gặp rất nhiều khó khăn. Hãy bình tĩnh và xem chi tiết lại mã lệnh của chúng ta thêm 1 lần nữa. Học cách đọc và tìm kiếm các thông báo lỗi của hệ thống.

Ở trường hợp xấu nhất, mình cung cấp mã nguồn đầy đủ của bài viết này cho các bạn. Nhưng hy vọng các bạn không cần sử dụng đến nó.