سؤال

العمل على المشروع في هذه اللحظة ونحن لدينا لتنفيذ لينة الحذف بالنسبة لغالبية المستخدمين (المستخدم أدوار).قررنا إضافة "is_deleted='0'" حقل في كل جدول في قاعدة البيانات تعيينها إلى '1' إذا كان مستخدم معين الأدوار ضرب زر حذف على سجل معين.

من أجل الصيانة في المستقبل الآن ، كل استعلام تحديد سوف تحتاج إلى التأكد من أنها لا تشمل السجلات حيث is_deleted='1'.

هل هناك حل أفضل لتنفيذ لينة الحذف?

تحديث:يجب أن نلاحظ أيضا أن علينا مراجعة بيانات لتتبع التغيرات (حقل القديمة القيمة ، قيمة جديدة, الوقت, المستخدم, ip) إلى جميع الجداول/الحقول في قاعدة بيانات التطبيق.

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

المحلول

هل يمكن إجراء جميع الاستفسارات الخاصة بك ضد الرأي الذي يحتوي على WHERE IS_DELETED='0' البند.

نصائح أخرى

أود أن تميل نحو "القضبان الطريق" مع deleted_at العمود الذي يحتوي على التاريخ والوقت من عند حذف وقعت.ثم يمكنك الحصول على القليل من الحرة الوصفية عن الحذف.الخاص بك SELECT مجرد الحصول على الصفوف WHERE deleted_at IS NULL

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

ونتيجة لذلك ، إذا كنت اكتب استعلام مثل

SELECT * FROM table_name WHERE is_deleted = 1

ثم أوراكل سوف تؤدي 'قسم التقليم و ننظر فقط إلى القسم المناسب.داخليا قسم مختلف الجدول ، لكنها شفافة بالنسبة لك كمستخدم:عليك أن تكون قادرا على تحديد عبر الجدول بأكمله بغض النظر عن ما إذا كان يتم تقسيم أو لا.ولكن أوراكل سوف تكون قادرة على الاستعلام فقط القسم يحتاج.على سبيل المثال, دعونا نفترض أن لديك 1000 الصفوف is_deleted = 0 و 100000 الصفوف is_deleted = 1, و تقسيم الجدول is_deleted.الآن إذا قمت بتضمين شرط

WHERE ... AND IS_DELETED=0

ثم أوراكل فقط مسح التقسيم مع 1000 الصفوف.إذا كان الجدول لم تكن مقسمة لكان مسح 101000 الصفوف (كل الأقسام).

إذا كان الجدول الكبيرة و الأداء هو المشكلة ، يمكنك أن تتحرك دائما 'حذف' سجلات إلى جدول آخر ، والتي لديها معلومات إضافية مثل الوقت من حذف الذي حذف سجل, الخ

وبهذه الطريقة لم يكن لديك لإضافة عمود آخر إلى الجدول الأساسي الخاص بك

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

في SQL Server, أفضل حل هو استخدام deleted_on/deleted_at عمود مع نوع من SMALLDATETIME أو التاريخ والوقت (اعتمادا على الضرورة تحبب) وجعل هذا العمود nullable.في SQL Server, صف رأس يحتوي على بيانات فارغة بت لكل الأعمدة في الجدول بحيث أنها هامشية أسرع إلى إجراء باطل أو غير باطل من التحقق من القيمة المخزنة في عمود.

إذا كان لديك كمية كبيرة من البيانات, سوف تحتاج إلى النظر في التقسيم البيانات الخاصة بك, إما من خلال قاعدة البيانات نفسها أو من خلال اثنين من جداول منفصلة (على سبيل المثالالمنتجات ProductHistory) أو من خلال طريقة العرض المفهرسة.

أنا عادة تجنب حقول العلم مثل is_deleted, is_archive ، إلخ لأنها تحمل سوى قطعة واحدة من معنى.أ nullable deleted_at, archived_at مجال يوفر مستوى إضافي من معنى إلى نفسك و إلى من يرث التطبيق الخاص بك.وأنا تجنب بت المجالات مثل الطاعون لأنها تتطلب فهم كيف بت بنيت من أجل فهم أي معنى.

هذا يعتمد على ما تحتاجه من معلومات و ما العمل كنت ترغب في تقديم الدعم.

هل تريد أن تكون قادرا على:

  • معرفة ما هي المعلومات التي كان هناك (قبل حذف)?
  • تعرف عندما تم حذفها ؟
  • أعرف من حذف ذلك ؟
  • في معرفة قدرة كانوا يتصرفون عندما حذف ذلك ؟
  • تكون قادرة على حذف السجل ؟
  • يكون قادرا على أن أقول عندما كانت الأمم المتحدة حذفها ؟
  • الخ.

إذا كان السجل المحذوفة وغير المحذوفة أربع مرات ، هل هي كافية بالنسبة لك أن تعرف أنه حاليا في الامم المتحدة المحذوفة الدولة ، أو تريد أن تكون قادرة على معرفة ما حدث في الفترة الانتقالية (بما في ذلك أي تعديلات بين المتعاقبة الحذف!)?

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

أعتقد من الدورة:

  1. إنشاء المستخدم (تسجيل الدخول=جو)
  2. لينة-حذف (مجموعة حذف عمود غير فارغة.)
  3. (إعادة) إنشاء المستخدم (تسجيل الدخول=جو).خطأ.تسجيل الدخول=جو بالفعل ،

الثانية إنشاء النتائج في انتهاك القيد لأن الدخول=جو هو بالفعل في الناعمة-حذف صف.

بعض التقنيات:1.نقل حذف سجل إلى جدول جديد.2.جعل الخاص بك تفرد القيد عبر تسجيل الدخول و deleted_at عمود الطابع الزمني

رأيي الخاص هو +1 من أجل الانتقال إلى الجدول الجديد.تأخذ الكثير من الانضباط للحفاظ على *و delete_at = NULL* في جميع استفسارات (لجميع المطورين)

سيكون لديك بالتأكيد على أداء أفضل إذا قمت بنقل البيانات المحذوفة إلى جدول آخر مثل جيم وقال: فضلا عن وجود سجل عندما كان المحذوفة ، لماذا ، وعلى يد من.

إضافة where deleted=0 لجميع الاستفسارات الخاصة بك سوف يبطئ عليهم بشكل كبير ، وتعيق استخدام أي من المؤشرات قد يكون على الطاولة.تجنب وجود "أعلام" في الجداول الخاصة بك كلما كان ذلك ممكنا.

شيء يمكنني استخدامها في المشاريع statusInd tinyint not null default 0 عمود باستخدام statusInd كما بت يسمح لي بأداء إدارة البيانات (حذف, أرشيف, تكرار, استعادة, الخ.).باستخدام هذا في وجهات النظر لا يمكن ثم لا توزيع البيانات ، النشر ، إلخ على التطبيقات المستهلكة.إذا كان الأداء هو القلق بشأن وجهات النظر واستخدام صغيرة الواقع الجداول لدعم هذه المعلومات اسقاط الواقع ، قطرات العلاقة ويسمح scalled حذف.

موازين جيدا و هي البيانات التي تركز على الحفاظ على البيانات بصمة صغيرة جدا - مفتاح 350gb+ dbs مع الوقت الحقيقي المخاوف.باستخدام بدائل, الجداول, مشغلات بعض النفقات العامة التي يتوقف على حاجة قد أو قد لا عمل لك.

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

لا أذكر ما هو المنتج ، ولكن SQL Server 2008 كيو (وغيرها أنا متأكد) تسمح لك لإنشاء المصفى الفهارس ، لذلك يمكن أن يخلق غطاء المؤشر حيث is_deleted=0, التخفيف من بعض السلبيات من هذا نهج معين.

أنا أفضل للحفاظ على عمود الحالة ، لذا يمكن استخدامه لعدة مختلف التكوينات ، أينشرت الخاصة, حذف, needsAproval...

استخدام طريقة عرض أو دالة أو إجراء فحوصات is_deleted=0 أيلا حدد مباشرة على الطاولة في حالة الجدول يحتاج إلى تغيير في وقت لاحق لأسباب أخرى

ومؤشر is_deleted عمود أكبر الجداول

منذ كنت بالفعل مراجعة وتتبع حذف تاريخ زائدة

إنشاء مخطط آخر ومنح كل على مخطط البيانات.Implment VPD على المخطط الجديد بحيث كل الاستعلام سوف يكون المسند مما يتيح اختيار عدم حذف صف فقط الملحق به.http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/cmntopc.htm#CNCPT62345

@AdditionalCriteria("هذا.حالة <> 'حذف'")

ضع هذا على قمة @الكيان

http://wiki.eclipse.org/EclipseLink/Examples/JPA/SoftDelete

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