2009-09-30 39 views
6

Tôi có lược đồ cơ sở dữ liệu cho một dự án tích hợp mà tôi cần để có thể truy vấn các bản ghi có thay đổi, nhưng chỉ dựa trên tập hợp các trường trong hồ sơ đó.Thực hiện băm bản ghi cơ sở dữ liệu để theo dõi xem bản ghi đã thay đổi hay không

Vì vậy, ví dụ, đây là một ví dụ bảng:

KHÁCH HÀNG

  • ID
  • Tên
  • Điện thoại
  • Fax
  • Balance

Tôi cần truy vấn để tìm nạp các bản ghi có các trường Tên, Điện thoại hoặc Fax đã thay đổi. Tuy nhiên, không nên tính đến các trường khác, ví dụ: nếu chỉ trường Số dư thay đổi, truy vấn của tôi không được kéo bản ghi đó vào (do đó, trường dấu thời gian tự động cập nhật bất cứ khi nào bản ghi được sửa đổi không hoạt động).

Ngoài ra, điều này phải chạy trên một số cơ sở dữ liệu và nền tảng khác nhau, vì vậy TRIGGERS hoặc một cái gì đó tương tự không thực sự là một tùy chọn trừ khi chúng chạy trên MySQL, PostgreSQL, SQL Server và SQLLite.

Các trường được sửa đổi bởi ứng dụng của bên thứ ba mà tôi không thể sửa đổi, vì vậy tôi không thể thêm cờ và ứng dụng của bên thứ ba đặt cờ thành TRUE bất cứ khi nào nó sửa đổi trường có liên quan.

Giải pháp ban đầu của tôi là tính HASH của các trường liên quan và lưu trữ nó trong trường mới 'LastHash' hoặc thứ gì đó. Sau đó, tôi có thể tính toán giá trị băm của các trường liên quan cho dữ liệu hiện có trong bản ghi và nếu nó không khớp với LastHash được lưu trữ, tôi biết nó đã thay đổi.

Điều đó có vẻ khá lộn xộn ... nhưng có vẻ như nó sẽ hoạt động. Có cách nào tốt hơn? Nếu không, có cách nào tốt để thực hiện băm đó để nó có hiệu quả và không tốn quá nhiều thời gian để trích xuất các bản ghi đã thay đổi đó không?

EDIT

Một số làm rõ: Cả hai ứng dụng của tôi bản cập nhật ứng dụng khác và chèn vào các bảng. Tôi có thể làm cho ứng dụng của tôi tính toán băm ban đầu. Tôi không thể làm cho các ứng dụng khác tính toán nó mặc dù.

Cột dấu thời gian tự động cập nhật bất cứ khi nào thay đổi bản ghi có thể thực hiện được, chúng đủ dễ dàng sao chép trong tất cả hệ thống cơ sở dữ liệu bằng các loại cột khác nhau hoặc trình kích hoạt rất đơn giản.

BỔ SUNG CÂU HỎI

Nếu băm là con đường để đi ... là có bất kỳ loại thuật toán băm hiệu quả đó sẽ không kéo dài mãi để tính toán trên tất cả các hồ sơ? MD5 hoặc SHA1 có thể hoạt động, nhưng có vẻ như chúng là sllloowwww.

+1

Làm cách nào để bạn chèn/cập nhật băm mà không sử dụng trình kích hoạt hoặc sửa đổi ứng dụng thực hiện chèn? –

+0

EDIT: Tôi có thể làm cho ứng dụng của tôi tính toán băm ban đầu. Tôi không thể làm cho các ứng dụng khác tính toán nó mặc dù. –

Trả lời

2

Đó là một điều khó khăn. Bạn vẫn sẽ phải quét bảng (hoặc quét chỉ mục), vì bạn phải tính toán băm mới và so sánh nó với băm cũ được lưu trữ.

Nếu không thể kích hoạt vì các mối quan tâm đa nền tảng, bạn có thể có công cụ cơ sở dữ liệu tính toán giá trị băm hiện tại (tức là cột được tính tồn tại - có hiệu quả như trình kích hoạt). Đây cũng là vấn đề đa nền tảng! Sau đó, nếu bạn chỉ mục băm hiện tại và băm của bạn, đó là một tìm kiếm tương đối dễ dàng hơn.

Bạn ít nhất có thể sử dụng trường dấu thời gian để giảm số lượng băm bạn cần kiểm tra không?

Một điều cần nhớ là không có chức năng băm hoàn hảo như vậy, vì vậy bạn có khả năng có thể có âm bản sai (va chạm băm vô ý dẫn đến thay đổi không được phát hiện). Đó có phải là rủi ro (thiên văn nhỏ) đáng để tham gia không?

+0

Ý tưởng sử dụng dấu thời gian cùng với băm là một tốt nhất, tôi thích điều đó. Điều đó sẽ giữ hiệu suất tốt hơn nhiều. Tôi nghĩ khả năng tìm thấy xung đột băm là khá thấp. Tôi có thể sử dụng SHA1 hoặc một cái gì đó nếu tôi tìm thấy MD5 là không đủ. –

+0

Không sử dụng băm mật mã một chiều nếu bạn không cần. MD5 và SHA1 (mặc dù dễ bị tấn công) được thiết kế dưới dạng băm mật mã. Sử dụng một cái gì đó như CRC32 hoặc CRC64 sẽ được MUCH hơn performant. – scotru

+0

@scotru - CRC không nên được sử dụng để theo dõi thay đổi. Tôi dựa trên nhận xét này: http://stackoverflow.com/a/7509974/1631910 – tomosius

0

Tôi sẽ chuẩn hóa cách ứng dụng của bạn kiểm tra sự khác biệt, chứ không phải cách cơ sở dữ liệu triển khai nó. Hãy thử một cái gì đó như sử dụng chế độ xem với một cột cụ thể có nghĩa là một thay đổi. Sau đó, sử dụng các thủ thuật thích hợp được triển khai trong từng cơ sở dữ liệu để biến chế độ xem đó thành hiện thực. Mã mà phụ thuộc vào việc kiểm tra sự khác biệt này sẽ giống nhau, sử dụng cùng một khung nhìn và cột.

+0

Tách các cột thành hai bảng * không phải là * một tùy chọn. Tôi không thể thay đổi ứng dụng của bên thứ ba khác để thích ứng với thay đổi cơ sở dữ liệu đó. –

+0

@Keith Palmer, chỉ đọc lại câu hỏi –

Các vấn đề liên quan