Lời nói đầu: Tôi đã suy nghĩ về một cấu trúc cơ sở dữ liệu mới cho một ứng dụng mới và nhận ra rằng chúng tôi cần một cách để lưu trữ dữ liệu lịch sử một cách hiệu quả. Tôi muốn một người khác xem xét và xem liệu có bất kỳ vấn đề nào với cấu trúc này không. Tôi nhận ra rằng phương pháp lưu trữ dữ liệu này rất có thể đã được phát minh trước đây (tôi gần như chắc chắn nó có) nhưng tôi không biết nó có tên và một số tìm kiếm trên google mà tôi đã thử không mang lại gì hay không.Cấu trúc cơ sở dữ liệu để lưu trữ dữ liệu lịch sử
Sự cố: Giả sử bạn có bảng cho đơn đặt hàng và đơn đặt hàng có liên quan đến bảng khách hàng cho khách hàng đã đặt hàng. Trong một cấu trúc cơ sở dữ liệu thông thường bạn có thể mong đợi một cái gì đó như thế này:
orders
------
orderID
customerID
customers
---------
customerID
address
address2
city
state
zip
Khá đơn giản, OrderID có một chìa khóa nước ngoài của ID khách hàng đó là khóa chính của bảng khách hàng. Nhưng nếu chúng tôi đi và chạy báo cáo trên bảng thứ tự, chúng tôi sẽ tham gia bảng khách hàng vào bảng đơn đặt hàng, sẽ mang lại bản ghi hiện tại cho ID khách hàng đó. Điều gì sẽ xảy ra nếu khi đơn đặt hàng được đặt, địa chỉ của khách hàng là khác nhau và nó đã được thay đổi sau đó. Bây giờ đơn đặt hàng của chúng tôi không còn phản ánh lịch sử của địa chỉ khách hàng đó, vào thời điểm đặt hàng. Về cơ bản, bằng cách thay đổi hồ sơ khách hàng, chúng tôi chỉ thay đổi tất cả lịch sử cho khách hàng đó.
Bây giờ có một số cách để giải quyết vấn đề này, một trong số đó sẽ là sao chép bản ghi khi đơn đặt hàng được tạo. Những gì tôi đã đưa ra mặc dù là những gì tôi nghĩ rằng sẽ là một cách dễ dàng hơn để làm điều này có lẽ là một chút thanh lịch hơn, và có thêm tiền thưởng của đăng nhập bất cứ lúc nào một sự thay đổi được thực hiện.
gì nếu tôi đã làm một cấu trúc như thế này thay vì:
orders
------
orderID
customerID
customerHistoryID
customers
---------
customerID
customerHistoryID
customerHistory
--------
customerHistoryID
customerID
address
address2
city
state
zip
updatedBy
updatedOn
xin vui lòng tha thứ cho định dạng, nhưng tôi nghĩ rằng bạn sẽ nhìn thấy ý tưởng. Về cơ bản, ý tưởng là bất cứ khi nào một khách hàng được thay đổi, chèn hoặc cập nhật, customerHistoryID được tăng lên và bảng khách hàng được cập nhật với customerHistoryID mới nhất. Bảng thứ tự bây giờ không chỉ trỏ đến customerID (cho phép bạn xem tất cả các bản sửa đổi của bản ghi khách hàng), mà còn cho customerHistoryID, nó trỏ đến một bản sửa đổi cụ thể của bản ghi. Bây giờ thứ tự phản ánh trạng thái của dữ liệu tại thời điểm thứ tự được tạo ra.
Bằng cách thêm cột cập nhật và cập nhật vào bảng customerHistory, bạn cũng có thể thấy "nhật ký kiểm tra" của dữ liệu, để bạn có thể xem ai đã thực hiện thay đổi và thời điểm.
Một nhược điểm tiềm năng có thể bị xóa, nhưng tôi không thực sự lo lắng về điều đó vì nhu cầu này vì không có gì bị xóa. Nhưng thậm chí vẫn còn, hiệu ứng tương tự có thể đạt được bằng cách sử dụng một activeFlag hoặc một cái gì đó như nó phụ thuộc vào tên miền của dữ liệu.
Suy nghĩ của tôi là tất cả các bảng sẽ sử dụng cấu trúc này. Dữ liệu lịch sử bất cứ lúc nào đang được truy lục, nó sẽ được nối với bảng lịch sử bằng cách sử dụng customerHistoryID để hiển thị trạng thái dữ liệu cho thứ tự cụ thể đó.
Lấy danh sách khách hàng thật dễ dàng, chỉ cần tham gia vào bảng khách hàng trên customerHistoryID.
Mọi người có thể thấy bất kỳ vấn đề nào với phương pháp này, hoặc từ quan điểm thiết kế hoặc lý do hiệu suất tại sao điều này là xấu. Hãy nhớ rằng, không có vấn đề gì tôi cần phải đảm bảo rằng các dữ liệu lịch sử được bảo quản để cập nhật tiếp theo cho hồ sơ không thay đổi lịch sử. Có cách nào tốt hơn? Đây có phải là ý tưởng đã biết có tên hoặc bất kỳ tài liệu nào về nó không?
Cảm ơn bạn đã được trợ giúp.
Cập nhật: Đây là một ví dụ rất đơn giản về những gì tôi thực sự sẽ có. Ứng dụng thực sự của tôi sẽ có "đơn đặt hàng" với một số phím nước ngoài để bàn khác. Thông tin vị trí gốc/đích, thông tin khách hàng, thông tin cơ sở, thông tin người dùng, v.v. Đã được đề xuất một vài lần tôi có thể sao chép thông tin vào hồ sơ đặt hàng tại thời điểm đó và tôi đã thấy nó được thực hiện theo cách này nhiều lần, nhưng điều này sẽ dẫn đến một kỷ lục với hàng trăm cột, mà thực sự là không khả thi trong trường hợp này.
Vì vậy, về cơ bản những gì bạn đang nói là: "Tôi có quá nhiều cột trong bảng thứ tự Vì vậy, tôi muốn. để đặt địa chỉ thứ tự trong bảng khách hàng. Để hỗ trợ điều này, tôi muốn thỏa hiệp dữ liệu khách hàng với lược đồ theo dõi lịch sử phức tạp. " Âm thanh như một ý tưởng tồi với tôi. –
Không ... không hề. Điều tôi đang nói là tôi cần có khả năng theo dõi địa chỉ, khi họ thay đổi, và có thể liên kết một đơn đặt hàng với một tiểu bang cụ thể (bản sửa đổi) của một địa chỉ. Đơn đặt hàng có thể không phải là bảng duy nhất có liên quan đến địa chỉ, chưa kể chúng tôi muốn biết khi nào và ai đã thay đổi địa chỉ. –
BTW không bao giờ giả định sẽ không bao giờ bị xóa. Lập kế hoạch xóa sẽ vô tình xảy ra hoặc tạo ra một kích hoạt mà sẽ không cho phép xóa. – HLGEM