Tôi sẽ chia sẻ với bạn thiết kế của tôi và nó khác với cả hai thiết kế của bạn ở chỗ nó yêu cầu một bảng cho mỗi loại thực thể. Tôi tìm thấy cách tốt nhất để mô tả bất kỳ thiết kế cơ sở dữ liệu nào là thông qua ERD, đây là của tôi:
Trong ví dụ này, chúng tôi có một thực thể có tên là nhân viên . sử dụng bảng giữ hồ sơ và người dùng của bạn thực thể và entity_revision hai bảng mà giữ lịch sử sửa đổi cho tất cả các loại thực thể mà bạn sẽ có trong hệ thống của bạn. Đây là cách thiết kế này hoạt động:
Hai trường của entity_id và revision_id
Mỗi thực thể trong hệ thống của bạn sẽ có một id thực thể duy nhất của riêng nó. Thực thể của bạn có thể trải qua các phiên bản nhưng thực thể của nó sẽ vẫn như cũ. Bạn cần giữ id thực thể này trong bảng nhân viên của bạn (dưới dạng khóa ngoại). Bạn cũng nên lưu trữ loại thực thể của mình trong bảng thực thể (ví dụ: 'staff'). Bây giờ, đối với revision_id, như tên của nó hiển thị, nó theo dõi các phiên bản thực thể của bạn. Cách tốt nhất tôi tìm thấy cho việc này là sử dụng worker_id làm revision_id của bạn. Điều này có nghĩa là bạn sẽ có id sửa đổi trùng lặp cho các loại thực thể khác nhau nhưng điều này không đối xử với tôi (tôi không chắc về trường hợp của bạn). Lưu ý quan trọng duy nhất cần thực hiện là sự kết hợp giữa entity_id và revision_id phải là duy nhất.
Ngoài ra còn có một trường trạng thái trong bảng entity numvision chỉ ra trạng thái sửa đổi. Nó có thể có một trong ba trạng thái: latest
, obsolete
hoặc deleted
(không dựa vào ngày sửa đổi sẽ giúp bạn rất nhiều để thúc đẩy các truy vấn của bạn).
Một lưu ý cuối cùng về revision_id, tôi đã không tạo khóa ngoại kết nối worker_id với revision_id vì chúng tôi không muốn thay đổi bảng entity numvision cho từng loại thực thể mà chúng tôi có thể thêm trong tương lai.
CHỨNG MINH
Đối với mỗi nhân viên mà bạn muốn chèn vào cơ sở dữ liệu, bạn cũng sẽ bổ sung thêm một kỷ lục để tổ chức và entity_revision . Hai bản ghi cuối cùng này sẽ giúp bạn theo dõi ai và khi một bản ghi đã được chèn vào cơ sở dữ liệu.
CẬP NHẬT
Mỗi bản cập nhật cho một hồ sơ nhân viên hiện tại sẽ được triển khai dưới dạng hai lần chèn, một trong bảng nhân viên và một trong thực thể. Điều thứ hai sẽ giúp bạn biết ai và khi nào hồ sơ đã được cập nhật.
XÓA
Để xóa một nhân viên, một bản ghi được chèn vào entity numvision cho biết việc xóa và được thực hiện.
Như bạn có thể thấy trong thiết kế này, không có dữ liệu nào bị thay đổi hoặc xóa khỏi cơ sở dữ liệu và quan trọng hơn là mỗi loại thực thể chỉ cần một bảng. Cá nhân tôi thấy thiết kế này thực sự linh hoạt và dễ làm việc. Nhưng tôi không chắc về bạn vì nhu cầu của bạn có thể khác.
[CẬP NHẬT]
Có các phân vùng được hỗ trợ trong các phiên bản MySQL mới, tôi tin rằng thiết kế của tôi cũng đi kèm với một trong những hiệu suất tốt nhất. Người ta có thể phân vùng entity
bảng bằng cách sử dụng type
trường trong khi phân vùng entity_revision
sử dụng state
trường của nó . Điều này sẽ tăng các SELECT
truy vấn cho đến nay trong khi giữ cho thiết kế đơn giản và sạch sẽ.