Trong khi @WW. Câu trả lời là một câu trả lời hay theo cách khác là tạo một 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:
- Sử dụng cờ để chỉ báo Ala Word mới nhất
- HOẶC làm một điều khó chịu lớn hơn phiên bản
outer join
.
Một ví dụ SQL của outer join
phương thức sử dụng các 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
và tham gia bên ngoài có thể chậm. Tin tốt là việc tạo các mục mới rẻ hơn về mặt lý thuyết vì bạn có thể thực hiện nó trong một thao tác ghi với các giao dịch ngoài (giả sử cơ sở dữ liệu của bạn là nguyên tử).
Một ví dụ thực hiện sửa đổi 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 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 việc khóa và giao dịch lạc quan.
Cách tiếp cận cờ và cách tiếp cận bảng lịch sử yêu cầu hai hàng được chèn / cập nhật.
Ưu điểm khác với outer join
cách tiếp cận số sửa đổi là bạn luôn có thể cấu trúc lại cách tiếp cận nhiều bảng sau với các trình kích hoạt vì trình kích hoạt của bạn về cơ bản phải làm một cái gì đó như trên.