Vấn đề lớn nhất mà tôi gặp phải với INHERITS
của PostgreSQL triển khai là bạn không thể đặt một tham chiếu khóa ngoại cho bảng mẹ. Có rất nhiều rất nhiều trong số các trường hợp bạn cần làm điều đó. Xem các ví dụ ở cuối câu trả lời của tôi.
Quyết định tạo bảng, chế độ xem hoặc trình kích hoạt bên ngoài Rails là quyết định quan trọng. Một khi bạn quyết định làm điều đó, thì tôi nghĩ bạn cũng có thể sử dụng cấu trúc tốt nhất mà bạn có thể tìm thấy.
Từ lâu, tôi đã sử dụng bảng cha cơ sở, thực thi các kiểu con rời rạc bằng cách sử dụng khóa ngoại. Cấu trúc này đảm bảo chỉ có một liên kết có thể tồn tại và liên kết phân giải thành kiểu con bên phải trong bảng mẹ. (Trong trình chiếu của Bill Karwin trên SQL antipatterns , cách tiếp cận này bắt đầu trên trang trình bày 46.) Điều này không yêu cầu trình kích hoạt trong các trường hợp đơn giản, nhưng tôi thường cung cấp một chế độ xem có thể cập nhật cho mỗi loại phụ và yêu cầu mã máy khách để sử dụng các chế độ xem. Trong PostgreSQL, các dạng xem có thể cập nhật yêu cầu viết trình kích hoạt hoặc quy tắc. (Các phiên bản trước 9.1 yêu cầu các quy tắc.)
Trong trường hợp chung nhất, các kiểu con rời rạc không có cùng số lượng hoặc loại thuộc tính. Đó là lý do tại sao tôi thích các chế độ xem có thể cập nhật.
Kế thừa bảng không phải là di động, nhưng loại cấu trúc này là. Bạn thậm chí có thể triển khai nó trong MySQL. Trong MySQL, bạn phải thay thế các ràng buộc CHECK bằng các tham chiếu khóa ngoại cho các bảng một hàng. (MySQL phân tích cú pháp và bỏ qua các ràng buộc KIỂM TRA.)
Tôi không nghĩ rằng bạn phải lo lắng về vấn đề trùng lặp dữ liệu. Ngay từ đầu, tôi khá chắc chắn rằng dữ liệu không bị trùng lặp giữa bảng cha và bảng kế thừa. Nó chỉ xuất hiện theo cách đó. Ở vị trí thứ hai, trùng lặp hoặc dữ liệu có nguồn gốc có tính toàn vẹn được kiểm soát hoàn toàn bởi dbms không phải là một viên thuốc đặc biệt đắng để nuốt. (Nhưng không kiểm soát được trùng lặp là.)
Hãy suy nghĩ về việc liệu các thao tác xóa có nên chia thành tầng hay không.
- ví dụ về ấn phẩm với mã SQL.
- A " bên "ví dụ với mã SQL.