Lời khuyên của tôi về mô hình dữ liệu là:
- Bạn nên ưu tiên các cột tùy chọn (có thể vô hiệu) hơn các kết hợp 1:1 nói chung . Vẫn có những trường hợp 1:1 có ý nghĩa, thường xoay quanh kiểu phụ. Mọi người có xu hướng khó hiểu hơn khi nói đến các cột có thể trống hơn là khi họ kết hợp một cách kỳ lạ;
- Đừng làm mô hình cũng gián tiếp trừ khi thực sự hợp lý (thêm về điều này bên dưới);
- Sự ủng hộ kết hợp hơn là tổng hợp. Điều này có thể thay đổi vì vậy nó cần được kiểm tra. Xem Oracle vs MySQL vs SQL Server:Aggregation so với Tham gia cho một ví dụ về điều này;
- Tham gia tốt hơn N + 1 lựa chọn. Ví dụ:lựa chọn N + 1 là chọn một đơn đặt hàng từ bảng cơ sở dữ liệu và sau đó đưa ra một truy vấn riêng để lấy tất cả các mục hàng cho đơn hàng đó;
- Khả năng mở rộng của các liên kết là thường chỉ một vấn đề khi bạn đang thực hiện lựa chọn hàng loạt. Nếu bạn chọn một hàng duy nhất và sau đó nối hàng đó với một vài thứ thì hiếm khi đây là một vấn đề (nhưng đôi khi vẫn xảy ra);
- Khóa ngoại phải luôn luôn được lập chỉ mục trừ khi bạn đang xử lý một bảng nhỏ tầm thường;
Thông tin thêm về Sai lầm phát triển cơ sở dữ liệu do AppDevelopers mắc phải .
Bây giờ về tính trực tiếp của một mô hình, hãy để tôi cho bạn một ví dụ. Giả sử bạn đang thiết kế một hệ thống để xác thực và ủy quyền người dùng. Một giải pháp được khai thác quá mức có thể trông giống như sau:
- Bí danh (id, tên người dùng, user_id);
- Người dùng (id, ...);
- Email (id, user_id, email address);
- Đăng nhập (id, user_id, ...)
- Vai trò đăng nhập (id, login_id, role_id);
- Vai trò (id, tên);
- Đặc quyền của vai trò (id, role_id, đặc quyền_id);
- Đặc quyền (id, tên).
Vì vậy, bạn cần 6 lần tham gia để có được từ tên người dùng đã nhập đến các đặc quyền thực tế. Chắc chắn có thể có một yêu cầu thực tế cho điều này nhưng thường thì loại hệ thống này không được đưa vào do một số nhà phát triển vắt óc nghĩ rằng một ngày nào đó họ có thể cần nó mặc dù mỗi người dùng chỉ có một bí danh, người dùng đăng nhập là 1 :1 và như vậy. Một giải pháp đơn giản hơn là:
- Người dùng (id, tên người dùng, địa chỉ email, loại người dùng)
và, tốt, đó là nó. Có lẽ nếu bạn cần một hệ thống vai trò phức tạp nhưng cũng có khả năng bạn không làm như vậy và nếu bạn làm điều đó thì rất dễ dàng để đưa cũ thành mới.
Đây là vấn đề phức tạp:dễ thêm và khó xóa. Thông thường, đó là sự cảnh giác thường xuyên trước sự phức tạp ngoài ý muốn, điều này đã đủ tệ nếu không tiếp tục và làm cho nó trở nên tồi tệ hơn bằng cách thêm sự phức tạp không cần thiết.