مثال على الإصدارات البسيطة من سجلات PostgreSQL

عندما رأيت تنفيذ "تاريخ التسجيل" - الإصدار ، من جانب البرنامج الذي يعمل مع قاعدة بيانات SQL. قبل تغيير السجل ، تم الحصول على النسخة القديمة من قاعدة البيانات ، مكتوبة إلى XML وكتابة سلسلة XML الناتجة إلى جدول إصدار منفصل.

في البداية ، خطط في برنامجه للقيام بالإصدار في وقت لاحق ، لم تكن هناك حاجة ملحة. أتذكر أن هناك رغبة في استخدام نوع بيانات jsonb في مكان ما ، بمجرد أن فكرت في تطبيق بسيط وموجز للإصدار من جانب SQL ، لم أتمكن من القيام بذلك. جدول إصدار واحد فقط مع 5 أعمدة ووظيفة تشغيل واحدة في 3 أسطر من التعليمات البرمجية.

لوصف تنفيذ جدول إصدار واحد ليس كافيًا ، لذا عليك وصف بعض الجداول الأخرى على سبيل المثال.

في جميع قواعد البيانات تقريبًا ، مع وجود استثناءات نادرة ، يوجد جدول للمستخدمين - المستخدمون. من المفيد تخزين محفوظات التغييرات - إصدارات المستخدم ، على سبيل المثال ، للقدرة على التراجع إلى الإصدار القديم ، بواسطة المستخدم نفسه.

جدول المستخدم المثال:

الصورة

هناك حاجة إلى الحقلين الأخيرين في الصورة لجدول الإصدار ، ويمكن أيضًا تسميتهما "مؤلف الإصدار" و "تاريخ الإصدار" ، ولكن ، إذا رغبت في ذلك ، يمكنك الاستغناء عنهما.

جدول الإصدار:



وظيفة الزناد لحفظ الإصدارات:



يتم تعبئة أول حقلين من السجل المحفوظ OLD.changestamp و OLD.userid.
في جدول الإصدار ، لا يمكن تخزين إدخالات جدول المستخدمين فقط ، ولكن الحقل الثالث هو تجزئة MD5 لاسم الجدول الذي تم إصداره ، والذي تم تحويله إلى uuid.

وصفت الأمثلة سابقًا بنية بسيطة للغاية ، ولكن كقاعدة ، قد تحتوي البيانات المرجعية المختلفة على جداول إضافية ذات علاقة رأس بأطراف.

على سبيل المثال ، الجدول "مجموعات المستخدمين".



والجدول الثاني هو "مجموعة المستخدمين" ، تكوين المجموعة هو المستخدمين في المجموعة.



من أجل عدم تعقيد آلية الإصدار البسيطة ، يمكنك إجراء ازدواجية طفيفة للبيانات في جدول المجموعات ، وإضافة حقل jsonb الذي يكرر بنية جدول "Group Users".



لتبسيط العمل باستخدام البيانات المكررة ، يمكنك إنشاء وظيفة تشغيل إضافية ، مع INSERT أو UPDATE ، وملء الجدول "مجموعة المستخدمين" من حقل jsonb.



التكرار الموضح أعلاه ضروري فقط عندما يكون مطلوبًا الحصول على البيانات من الجدول في كثير من الأحيان وبأسرع وقت ممكن. على سبيل المثال ، إذا تم إجراء استعلام في كثير من الأحيان إلى جدول "مجموعة المستخدمين" لتحديد ما إذا كان المستخدم عضوًا في مجموعة المسؤولين. في حالات أخرى ، يمكن الحصول على البيانات عن طريق الاستعلام مباشرة من حقل jsonb ، وعدم استخدام جدول مكرر.

رمز المثال الكامل هنا

Source: https://habr.com/ru/post/ar423399/


All Articles