Thiết kế cơ sở dữ liệu
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ | cơ sở dữ liệu quan hệ |
| tables/ˈteɪblz/ | bảng |
| entities/ˈentɪtiz/ | thực thể |
| primary key/ˈpraɪməri kiː/ | khóa chính |
| foreign key/ˈfɒrən kiː/ | khóa ngoại |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | chuẩn hóa |
Một khóa học được đổi tên giờ có hai tiêu đề
- Một trường học sao chép tiêu đề khóa học vào mỗi dòng đăng ký. Việc đổi tên một số bản sao sẽ dẫn đến việc cùng một khóa học có hai tiêu đề xung đột.
- Một cơ sở dữ liệu quan hệ lưu trữ các dòng trong các bảng. Đầu tiên hãy xác định các thực thể, chẳng hạn như sinh viên và khóa học, cũng như mối quan hệ giữa chúng.
Tách biệt danh tính khỏi nhãn có thể thay đổi
- Một khóa chính xác định duy nhất một dòng và không được phép为空. Mã sinh viên ổn định giúp việc thay đổi tên mà không làm thay đổi danh tính của sinh viên.
- Một khóa tự nhiên có thể hoạt động nếu tính duy nhất và ổn định của nó được đảm bảo. Tên là một khóa kém ở đây vì nhiều sinh viên có thể trùng tên; địa chỉ email cũng có thể thay đổi.
Sinh viên có thể trùng tên và thay đổi địa chỉ email. Khóa nào là tốt nhất cho thiết kế này?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Chọn một danh tính ổn định thay vì một nhãn bị lặp lại hoặc thay đổi.
Biểu diễn mối quan hệ nhiều-nhiều
- Một sinh viên có thể theo học nhiều khóa học; một khóa học có thể có nhiều sinh viên. Sử dụng bảng đăng ký với một dòng cho mỗi cặp sinh viên–khóa học.
- Một khóa ngoại liên kết mỗi lần đăng ký với khóa sinh viên hoặc khóa học hợp lệ. Khóa chính tổ hợp
(student_id, course_id)ngăn cặp giống nhau xuất hiện hai lần.
Thiết kế nào biểu diễn sinh viên tham gia nhiều môn học và mỗi môn học có nhiều sinh viên?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Mỗi bản đăng ký ghi lại một cặp sinh viên–môn học.
Loại khóa nào liên kết việc đăng ký với khóa khóa đã tồn tại?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Khóa ngoại đại diện và ràng buộc tham chiếu này khi khả năng thực thi được bật.
Ràng buộc nào ngăn cặp sinh viên–môn học giống nhau xuất hiện hai lần?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Khóa chính tổng hợp xác định cặp đó.
Lưu giữ một sự thật về khóa học cùng với khóa học
- Chuẩn hóa tổ chức các bảng dựa trên sự phụ thuộc của chúng để giảm thiểu việc lặp lại không nhất quán. Trong thiết kế này, mã khóa học xác định tên của nó, vì vậy hãy lưu tên vào bảng courses.
- Giá trị khóa ngoại bị lặp lại là điều có thể chấp nhận: nhiều lần đăng ký có thể tham chiếu đến cùng một khóa học. Quy tắc “không bao giờ lặp lại bất kỳ giá trị nào” không phải là quy tắc thiết kế cơ sở dữ liệu hữu ích.
Lặp lại cùng một mã khóa trong nhiều dòng đăng ký luôn là lỗi chuẩn hóa.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Việc tham chiếu lặp lại là điều dự kiến. Việc sao chép tên khóa vào mỗi dòng quan hệ sẽ tạo ra vấn đề cập nhật ở đây.
Bật và kiểm tra các ràng buộc
- Trong SQLite, hãy bật chế độ enforce khóa ngoại (foreign-key enforcement) trên từng kết nối với
PRAGMA foreign_keys = ONtrước khi bắt đầu công việc. Việc chỉ khai báo mối quan hệ là chưa đủ. - Kiểm thử một lần đăng hợp lệ, một cặp trùng lặp và một lần đăng tham chiếu đến một khóa học không tồn tại. Các ràng buộc nên từ chối hai trường hợp sau; chúng không quyết định ai là người gọi có quyền.
PRAGMA foreign_keys = ON;
CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (
student_id INTEGER REFERENCES students(id),
course_id INTEGER REFERENCES courses(id),
PRIMARY KEY (student_id, course_id),
CHECK (student_id IS NOT NULL AND course_id IS NOT NULL)
);
Tuyên khóa ngoại trong SQLite có nghĩa là chúng được áp đặt trên mọi kết nối mà không cần kích hoạt thủ công.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Bật PRAGMA foreign_keys = ON cho mỗi kết nối và kiểm tra hành vi thực tế.
Kiểm tra thiết kế theo một trường hợp mới
- Đối với việc mượn thư viện, tên sách không nhất thiết đại diện cho một bản sao vật lý duy nhất. Hãy xác định người mượn, bản sao và sự kiện vay mượn trước khi chọn khóa chính.
- Quyết định xem các sự kiện lặp lại có được phép hay không. Một cặp sinh viên–khóa học có thể xác định một lần đăng ký ở đây, nhưng một cặp người mượn–bản sao không thể phân biệt được các lần vay lặp lại vào các ngày khác nhau.
Chọn khóa chính cho danh tính bạn cần. Tách biệt thông tin thực thể khỏi hàng mối quan hệ, sau đó kiểm tra tính duy nhất và các ràng buộc tham chiếu bằng các trường hợp cụ thể.
Đề xuất các thực thể và khóa cho một thư viện nơi người mượn có thể mượn cùng một bản sao vật lý nhiều lần.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Sử dụng ID người mượn, ID bản sao và một danh tính sự kiện vay riêng biệt với các chi tiết sự kiện cần thiết.
Tại sao cặp người vay–bản sao đơn thuần lại không đủ làm khóa để phân biệt các lần vay lặp lại?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Khóa phải phân biệt được các sự kiện cụ thể bạn muốn ghi nhận.