जबकि @ डब्लू डब्लू। उत्तर एक अच्छा जवाब है एक और तरीका है कि एक संस्करण कॉलम बनाएं और अपने सभी संस्करणों को एक ही तालिका में रखें।
एक टेबल अप्रोच के लिए आप या तो:
- नवीनतम अला वर्ड प्रेस को इंगित करने के लिए एक ध्वज का उपयोग करें
- या संस्करण की तुलना में अधिक गंदा है
outer join
।
outer join
संशोधन संख्याओं का उपयोग करते हुए विधि का एक उदाहरण SQL है:
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.
बुरी खबर यह है कि उपरोक्त की आवश्यकता है outer join
और बाहरी जुड़ाव धीमा हो सकता है। अच्छी खबर यह है कि नई प्रविष्टियां बनाना सैद्धांतिक रूप से सस्ता है, क्योंकि आप इसे एक लेनदेन के साथ ऑपरेशन में कर सकते हैं (यह मानते हुए कि आपका डेटाबेस परमाणु है)।
उदाहरण के लिए एक नया संशोधन '/stuff'
हो सकता है:
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}
)
हम पुराने डेटा का उपयोग करके सम्मिलित करते हैं। यह विशेष रूप से उपयोगी है यदि कहें कि आप केवल एक कॉलम को अपडेट करना चाहते थे और आशावादी लॉकिंग और लेनदेन से बचना चाहते थे।
ध्वज दृष्टिकोण और इतिहास तालिका के दृष्टिकोण को सम्मिलित / अद्यतन करने के लिए दो पंक्तियों की आवश्यकता होती है ।
outer join
संशोधन संख्या दृष्टिकोण के साथ अन्य लाभ यह है कि आप हमेशा ट्रिगर के साथ बाद में एकाधिक तालिका दृष्टिकोण के लिए रिफ्लेक्टर कर सकते हैं क्योंकि आपका ट्रिगर आवश्यक रूप से उपरोक्त जैसा कुछ करना चाहिए।