@WW. cevap iyi bir yanıttır Bir başka yol da bir sürüm sütunu yapmak ve tüm sürümlerinizi aynı tabloda tutmaktır.
Bir masa yaklaşımı için:
- En son ala Word Press'i belirtmek için bir bayrak kullanın
- VEYA sürümden daha kötü bir şey yapın
outer join
.
outer join
Revizyon numaralarını kullanan yöntemin örnek SQL'i :
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.
Kötü haber yukarıdaki bir gerektirir outer join
ve dış birleşimler yavaş olabilir. İyi haber şu ki, yeni girişler oluşturmak teorik olarak daha ucuzdur, çünkü işlemlerin dışında bir yazma işleminde (veritabanınızın atomik olduğu varsayılarak) yapabilirsiniz.
İçin yeni bir düzeltme yapan bir örnek şunlar '/stuff'
olabilir:
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}
)
Eski verileri kullanarak ekleriz. Bu, yalnızca bir sütunu güncellemek ve iyimser kilitleme ve / veya işlemlerden kaçınmak istediğinizi varsa özellikle yararlıdır.
Bayrak yaklaşımı ve geçmiş tablosu yaklaşımı iki satırın eklenmesini / güncellenmesini gerektirir.
outer join
Revizyon numarası yaklaşımının diğer avantajı, tetikleyicilerle daha sonra her zaman çoklu tablo yaklaşımına yeniden bakabilmenizdir, çünkü tetikleyiciniz esas olarak yukarıdaki gibi bir şey yapmalıdır.