سؤال

لدي شرط لتخزين جميع إصدارات الكيان بطريقة مفهرسة بسهولة وكانت تتساءل عما إذا كان لدى أي شخص مدخلات على النظام الذي يجب استخدامه.

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

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

من الناحية النظرية، يجب أن يكون من الممكن استخدام قاعدة بيانات علنية ونظام تحكم الإصدار لتقليد قاعدة بيانات زمنية ولكن هذا يبدو مروعا جدا.

لذلك كنت أتساءل ما إذا كان أي شخص قد صادف شيئا مشابها من قبل وكيف اقترب من ذلك؟

تحديثكما اقترح من قبل هارون هنا الاستعلام الذي نستخدمه حاليا (في MySQL). بالتأكيد بطيئة على طاولتنا مع صفوف 200K. (ID = مفتاح الجدول، شخص_ أن = معرف للشخص الواحد، مكررة إذا كان لدى الشخص العديد من المراجعات)

حدد الاسم من الشخص P حيث P.ID = (حدد MAX (ID) من شخص حيث Person_ID = P.Person_ID و Timestamp <=: Timestamp)

تحديثيبدو أن أفضل طريقة للقيام بذلك مع DB الزمنية ولكن بالنظر إلى أنه لا يوجد أي مصدر مفتوح لهذه الطريقة التالية هي أفضل طريقة هي تخزين صف جديد لكل تحديث. المشكلة الوحيدة هي ازدواجية الأعمدة دون تغيير واستعلام بطيء.

هل كانت مفيدة؟

المحلول

هناك طريقتان لمعالجة هذا. يفترض كلاهما أنك تقوم دائما بإدراج صفوف جديدة. في كل حالة، يجب عليك إدراج الطابع الزمني (created) الذي يخبرك عندما تم تعديل الصف ".

يستخدم النهج الأول عددا يحسب عدد الحالات التي لديك بالفعل. المفتاح الأساسي هو مفتاح الكائن بالإضافة إلى رقم الإصدار. يبدو أن المشكلة في هذا النهج ستحتاج إلى select max(version) لإجراء تعديل. في الممارسة العملية، نادرا ما تكون هذه مشكلة نظرا لأن جميع التحديثات من التطبيق، يجب أولا تحميل الإصدار الحالي من الشخص، وتعديله (وزيادة الإصدار) ثم أدخل الصف الجديد. لذلك المشكلة الحقيقية هي أن هذا التصميم يجعل من الصعب تشغيل التحديثات في قاعدة البيانات (على سبيل المثال، تعيين خاصية للعديد من المستخدمين).

يستخدم النهج التالي روابط في قاعدة البيانات. بدلا من مفتاح مركب، يمكنك إعطاء كل كائن مفتاح جديد ولديك replacedBy الحقل الذي يحتوي على مفتاح الإصدار التالي. هذا النهج يجعل من السهل العثور على الإصدار الحالي (... where replacedBy is NULL). التحديثات هي مشكلة، حيث يجب عليك إدراج صف جديد وتحديث واحد موجود.

لحل هذا، يمكنك إضافة مؤشر الظهر (previousVersion). بهذه الطريقة، يمكنك إدراج الصفوف الجديدة ثم استخدم مؤشر الخلف لتحديث الإصدار السابق.

نصائح أخرى

فيما يلي مسح (مؤرخة إلى حد ما) لأدبيات البيانات الزمنية: http://citeseerx.ist.psu.edu/viewdoc/download؟doi=10.1.1.91.6988&rep=rep1&type=pdf.

أود أن أوصي بقضاء جيدة أثناء الجلوس مع تلك المراجع و / أو منحة جوجل لمحاولة العثور على بعض التقنيات الجيدة التي تناسب نموذج البيانات الخاص بك. حظا طيبا وفقك الله!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top