"Vì vậy, câu trả lời của bạn là" không thể "?"
Nhiều thứ có thể. Trong trường hợp rất đặc biệt của bạn, có vẻ như tôi thực thi ràng buộc 'bổ sung' của bạn bằng cách giữ bảng cơ sở dữ liệu đơn (4 cột). Điều này sẽ đảm bảo với bạn rằng mọi kết hợp a, b sẽ luôn luôn tương ứng với cùng một d (bởi vì chỉ có thể có một d). Cái giá bạn phải trả là không còn cách "tự nhiên" (tức là một hệ quả tức thời của cấu trúc rất logic của cơ sở dữ liệu) sẽ tự động thực thi a-> d và b-> d FD của bạn "tự động" .
Một thực tế nổi tiếng là quá trình phân rã thông thường hóa cổ điển, đôi khi yêu cầu một số FD nhất định được khôi phục như một ràng buộc cơ sở dữ liệu, bởi vì trong thiết kế phân tách, quy tắc không còn có thể được nêu là FD. Trường hợp cụ thể của bạn dường như là một trường hợp như vậy, trong đó bạn có sự lựa chọn giữa một thiết kế "tự động" thi hành a-> d và b-> d, nhưng bạn phải nỗ lực thêm để thực thi ràng buộc bổ sung hoặc thiết kế đó "tự động" thi hành ràng buộc bổ sung của bạn, nhưng ở đó bạn phải thực hiện thêm công việc để thực thi [các ràng buộc tương ứng với] các a-> d và b-> d FD của bạn.
Có TẤT CẢ các ràng buộc mà bạn đề cập được thi hành chỉ bằng cấu trúc cơ sở dữ liệu, trong trường hợp cụ thể của bạn, có thể sử dụng giải pháp của onedaywhen. Tuy nhiên, (a) chỉ là một giải pháp cho các trường hợp cụ thể như ví dụ của bạn, (b) giá bạn phải trả là tăng dự phòng và do đó, sự phức tạp bổ sung trong việc cập nhật cơ sở dữ liệu của bạn (và một số cập nhật nhất định có thể không đạt được !!!) và (c) vẫn còn một thực tế là không phải tất cả các ràng buộc cơ sở dữ liệu có thể hiểu được đều có thể biểu thị như một FD.
(Xin lỗi vì đã đăng câu trả lời thứ hai. Đăng nhập Stackoverflow của tôi không cho phép tôi nhận xét ở đây.)