Đây là một cách để làm điều đó:
Về cơ bản, chúng tôi không bao giờ sửa đổi hoặc xóa dữ liệu hiện có. Chúng tôi "sửa đổi" nó bằng cách tạo một phiên bản mới. Chúng tôi "xóa" nó bằng cách đặt cờ ĐÃ XÓA.
Ví dụ:
- Nếu sản phẩm thay đổi giá, chúng tôi sẽ chèn một hàng mới vào PRODUCT_VERSION trong khi các đơn đặt hàng cũ vẫn được kết nối với PRODUCT_VERSION cũ và giá cũ.
- Khi người mua thay đổi địa chỉ, chúng tôi chỉ cần chèn một hàng mới vào CUSTOMER_VERSION và liên kết các đơn hàng mới với hàng đó, trong khi vẫn liên kết các đơn hàng cũ với phiên bản cũ.
- Nếu sản phẩm bị xóa, chúng tôi không thực sự xóa sản phẩm đó - chúng tôi chỉ đặt cờ PRODUCT.DELETED, vì vậy, tất cả các đơn đặt hàng trước đây đã thực hiện cho sản phẩm đó vẫn nằm trong cơ sở dữ liệu.
- Nếu khách hàng bị xóa (ví dụ:vì (các) anh ấy yêu cầu được hủy đăng ký), hãy đặt cờ CUSTOMER.DELETED.
Lưu ý:
- Nếu tên sản phẩm cần phải là duy nhất, tên đó không thể được thực thi một cách khai báo trong mô hình ở trên. Bạn sẽ cần "quảng bá" TÊN từ PRODUCT_VERSION lên PRODUCT, đặt nó thành chìa khóa ở đó và từ bỏ khả năng "phát triển" tên sản phẩm hoặc thực thi tính duy nhất trên chỉ PRODUCT_VER mới nhất (có thể thông qua trình kích hoạt).
- Có một vấn đề tiềm ẩn với quyền riêng tư của khách hàng. Nếu khách hàng bị xóa khỏi hệ thống, có thể muốn xóa dữ liệu của họ khỏi cơ sở dữ liệu và chỉ thiết lập CUSTOMER.DELETED sẽ không làm điều đó. Nếu đó là mối lo ngại, hãy xóa dữ liệu nhạy cảm về quyền riêng tư trong tất cả các phiên bản của khách hàng hoặc ngắt kết nối đơn đặt hàng hiện tại khỏi khách hàng thực và kết nối lại với một khách hàng "ẩn danh" đặc biệt, sau đó xóa tất cả các phiên bản của khách hàng.
Mô hình này sử dụng rất nhiều mối quan hệ xác định. Điều này dẫn đến các khóa ngoại "béo" và có thể là một chút vấn đề về lưu trữ vì MySQL không hỗ trợ nén chỉ mục hàng đầu (không giống như Oracle), nhưng mặt khác InnoDB luôn luôn phân cụm dữ liệu trên PK và việc phân cụm này có thể có lợi cho hiệu suất. Ngoài ra, các JOIN ít cần thiết hơn.
Mô hình tương đương với các mối quan hệ không xác định và các khóa thay thế sẽ trông như thế này: