Trong khi @WW. câu trả lời là một câu trả lời hay là một cách khác là tạo cột phiên bản và giữ tất cả các phiên bản của bạn trong cùng một bảng.
Đối với một cách tiếp cận bảng bạn có:
- Sử dụng một lá cờ để chỉ ra ala mới nhất Word Press
- HOẶC làm một khó chịu hơn so với phiên bản
outer join
.
Một ví dụ SQL của outer join
phương pháp sử dụng số sửa đổi là:
SELECT tc.*
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- path in this case is our natural id.
Tin xấu là ở trên đòi hỏi một outer join
trong và bên ngoài tham gia có thể chậm. Tin tốt là tạo ra các mục mới về mặt lý thuyết là rẻ hơn bởi vì bạn có thể làm điều đó trong một thao tác ghi với các giao dịch out (giả sử cơ sở dữ liệu của bạn là nguyên tử).
Một ví dụ thực hiện một phiên bản mới cho '/stuff'
có thể là:
INSERT INTO text_content (id, path, data, revision, revision_comment, enabled, create_time, update_time)
(
SELECT
(md5(random()::text)) -- {id}
, tc.path
, 'NEW' -- {data}
, (tc.revision + 1)
, 'UPDATE' -- {comment}
, 't' -- {enabled}
, tc.create_time
, now()
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- {path}
)
Chúng tôi chèn bằng cách sử dụng các dữ liệu cũ. Điều này đặc biệt hữu ích nếu nói rằng bạn chỉ muốn cập nhật một cột và tránh khóa và giao dịch lạc quan.
Cách tiếp cận cờ và phương pháp tiếp cận bảng lịch sử yêu cầu hai hàng để chèn/cập nhật.
Ưu điểm khác với phương pháp tiếp cận số sửa đổi outer join
là bạn luôn có thể cấu trúc lại phương pháp tiếp cận nhiều bảng sau với trình kích hoạt vì trình kích hoạt của bạn về cơ bản sẽ làm điều gì đó như trên.
Nguồn
2012-11-28 02:25:30
Bạn có thể thực hiện cập nhật bảng kiểm tra bằng trình kích hoạt cơ sở dữ liệu nếu lớp truy cập dữ liệu của bạn không trực tiếp hỗ trợ nó. Ngoài ra, không khó để xây dựng trình tạo mã để làm cho trình kích hoạt sử dụng nội suy từ từ điển dữ liệu hệ thống. – ConcernedOfTunbridgeWells
Tôi woyuld khuyên bạn nên thực sự chèn dữ liệu _new_, không phải trước đó, vì vậy bảng lịch sử có tất cả dữ liệu. Mặc dù nó lưu trữ dữ liệu redyundent, nó loại bỏ các trường hợp đặc biệt cần thiết để đối phó với tìm kiếm trong cả hai bảng khi dữ liệu lịch sử được yêu cầu. – Nerdfest
@Nerdfest - Tôi có nghĩa là chèn tất cả các giá trị hiện tại vào bảng lịch sử, và sau đó cập nhật bảng chính với các giá trị mới. –