الانتقال إلى المحتوى

هل يوجد بديل ل Sequence يكون اكثر منه دقه


Ahmed Khayal

Recommended Posts

من المعروف ان من عيوب Sequence

انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence 

وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده 
أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3
فأصبح الموجود في الجدول 1 ثم 3
وهي مشكله معروفه 

اعتقد انه يتم برمجيا بعيدا عن Sequence 
بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه 
في الجدول 
ام 
إذا وجد Master Detail 
أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به 
فكيف يتم برمجيا

ام عن سؤالي فما هو بديل Sequence

رابط هذا التعليق
شارك

يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key)

فيفضل أن تستخدم معه Sequence

خاصة في بيئة الويب.

رابط هذا التعليق
شارك

انت كدا هتجبرنى استخدم الربط بحقل Sequence 
ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساسا
طيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟
ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسى
وفى نفس الوقت لايوجد به مشكله 
Sequence 

 

تم تعديل بواسطة Ahmed Khayal
رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

السلام عليكم و رحمة الله و بركاته

بامكانك استخدام Sequence  و ادخل قيمة الحقل عند لحظة الاضافة و ذلك من خلال  استخدام doDML   على مستوي ال EO

    protected void doDML(int operation, TransactionEvent e) {
        if (operation == DML_INSERT) {
   و بذلك تتاكد بانك استخدمت ال Sequence وقت اضافة السجل الى قاعدة البيانات 

 

ربما يفيدك الرابط التالي

http://andrejusb.blogspot.com/2013/01/how-to-implement-gapless-sequence-in.html

 

بالتوفيق

تم تعديل بواسطة orcl
رابط هذا التعليق
شارك

من المعروف ان من عيوب Sequence

انه عند اضافة حقل جديد يأخذ الحقل رقمه القادم من Sequence 

وعند حذفه لأي سبب لا يعود كما كان ولكن ما بعده يأخذ رقم تالي له بالرغم من عدم وجوده 

أي نفترض ان رقم الحقل 1 ثم تم اضافة حقل فأصبح 2 ثم تم حذفه واضافه مره اخرى نجد انه يأخذ الرقم 3

فأصبح الموجود في الجدول 1 ثم 3

وهي مشكله معروفه 

اعتقد انه يتم برمجيا بعيدا عن Sequence 

بالبحث داخل الحقل واختيار الاكبر واضافه 1 ثم وضعه في الجدول 

ام إذا وجد Master Detail 

أي انه إذا اخذ حقل رقم الفاتورة مثلا في Master وأردت ان يأخذه في Detail لإضافة العناصر الخاصة به 

فكيف يتم برمجيا

ام عن سؤالي فما هو بديل Sequence

بداية صيغة السؤال خادعة ولا توحي بالمطلوب

السؤال الحقيقي هو "كيف يمكن ضمان عدم وجود قيم خالية غير مستخدمة في حالة Sequence؟ هل يوجد بديل أفضل؟"

رابط هذا التعليق
شارك

يمكنك عمل حقل اضافي فيه التسلسل الذي تريده برمجيا ، أما المفتاح الرئيسي (Primary Key)

فيفضل أن تستخدم معه Sequence

خاصة في بيئة الويب.

أتفق 100%

رابط هذا التعليق
شارك

انت كدا هتجبرنى استخدم الربط بحقل Sequence 

ودا هيبقى غير رقم الفاتوره لان مش هينفع يكون عندى رقم فاتوره مش موجود اساسا

طيب هل دا اللى بيستخدم فى البرامج فعلا ؟ ولا فى حلول اخرى ؟

ولنفترض انى مش عايز اعمل حقلين يكون عندى حقل واحد لرقم الفاتوره ويكون مفتاح رئيسى

وفى نفس الوقت لايوجد به مشكله Sequence 

 

يمكن أن يكون هناك حقلان ولا مشكلة في هذا

رابط هذا التعليق
شارك

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

ليست المشكلة مشكلة إدخال أكثر من عملية

المشكلة أن رقم الفاتورة قد يتكرر

يحدث هذا عندما يريد العميل إنشاء ترقيم مختلف للفواتير في فروع محتلفة وبالتالي يمكن تكرار رقم الفاتورة هنا

رابط هذا التعليق
شارك

السلام عليكم و رحمة الله و بركاته

بامكانك استخدام Sequence  و ادخل قيمة الحقل عند لحظة الاضافة و ذلك من خلال  استخدام doDML   على مستوي ال EO

    protected void doDML(int operation, TransactionEvent e) {

        if (operation == DML_INSERT) {

   و بذلك تتاكد بانك استخدمت ال Sequence وقت اضافة السجل الى قاعدة البيانات 

 

ربما يفيدك الرابط التالي

http://andrejusb.blogspot.com/2013/01/how-to-implement-gapless-sequence-in.html

 

بالتوفيق

هذا لا يضمن عدم وجود قيم خالية لأنه ببساطة لو كان هناك خطأ في الإدخال نفسه أو Exception فستضيع قيمة sequence

كما أنه لو قام شخص أخر بكتابة select seq_name.nextval from dual من قاعدة البيانات فستضيع القيمة

رابط هذا التعليق
شارك

بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله

عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر

واعتقدت ان الحل سيكون برمجيا بحتا بعيدا عن قاعدة البيانات

واتمنى ان تتناول المشكله بشكل ادق واضح ليكون مرجع لكل المبرمجين الجدد عندما تقابلهم نفس المشكله

شكرا ياستاذنا

 

رابط هذا التعليق
شارك

 

بشكل عام سأتناول طريقة المعالجة بشكل أدق في وقت لاحق بإذن الله

عذرا ياستاذنا على صيغة السؤال ولكن ماشغلنى اكثر هو المضمون وتوضيح الفكره بالداخل فحتى انى ذكرت امثله فى السؤال للتوضيح اكثر

واعتقدت ان الحل سيكون برمجيا بحتا بعيدا عن قاعدة البيانات

واتمنى ان تتناول المشكله بشكل ادق واضح ليكون مرجع لكل المبرمجين الجدد عندما تقابلهم نفس المشكله

شكرا ياستاذنا

 

 

إن شاء الله أوضحها

رابط هذا التعليق
شارك

بداية دعونا نفهم أصل المشكلة

توجد بعض البيانات المطلوب إنشاء رقم تسلسلي فيها دون أن يحدث فقد لأي رقم على الإطلاق

والأسباب في ذلك كثيرة

يعني مثلاً رقم الفاتورة يجب أن يكون رقماً مسلسلاً بحيث أنه لو وجدت فاتورة رقمها 1000 فهذا يعني وجود 1000 فاتورة

لا يسمح العميل أن يكون هناك رقم مفقود في الوسط لأي سبب

هنا يحتاج إلى حل برمجي لهذا

أيضاً أرقام المعاملات لا يسمح بالأرقام التي تضيع

وبالمثل الكثير من البيانات التي لا تسمح بوجود أرقام مفقودة

هذه هي أصل المشكلة

رابط هذا التعليق
شارك

إذن لدينا متطلب واضح من العميل

يجب أن يتم تعبئة رقم مسلسل لا يسمح بأي فراغ

لا يمكن أن يتراجع المستخدم عن العملية فيجد أن الرقم ضاع

هنا يكون على المبرمج التفكير في الحلول البرمجية المناسبة لحل هذه المشكلة

نتعرف على الحلول المختلفة لهذه الجزئية

رابط هذا التعليق
شارك

قد يفكر الشخص في استخدام Sequence حيث أن استخدامه الأساسي بالفعل هو رقم مسلسل

يذهب المبرمج إلى دالة create ويضع الكود فيها

المشكلة التي تحدث هنا هو أنه إذا قام المستخدم بإنشاء جديد ثم تراجع

أو أغلق الجهاز

أو حدثت مشكلة في النظام

أو في الاتصال

هنا تحدث المشكلة

القيمة التي يتم الحصول عليها من Sequence لا يمكن الحصول عليها مرة أخرى

العداد لا يتوقف أبداً

إذن هذا الحل غير مناسب

رابط هذا التعليق
شارك

من الممكن إجراء تحسين هنا عن طريق تحويل الكود إلى الدالة doDML بدلاً من create

لا تزال هناك مشكلة أنه لو حدث خطأ في الإدخال نفسه فسيضيع الرقم

كما أنه لو قام أحد الأشخاص بكتابة جملة select seq.nextval from dual فسيضيع الرقم أيضاً

إذن هذا الحل ليس مناسباً أيضاً

رابط هذا التعليق
شارك

حسناً قد نفكر أن نقوم بعمل sequence برمجياً

يعني مثلاً نقوم بإنشاء جدول خارجي ونضع فيه الرقم الحالي بحيث أنه يتم جلب القيمة من الجدول وزيادتها بعد التأكد من الإدخال

حسناً لنحلل هذا الحل

رابط هذا التعليق
شارك

يكون لدينا الخيارين أيضاً

إما أن نضع الكود داخل create أو داخل doDML

في حالة create فهذا يسبب مشكلة كبرة في حالة وجود أكثر من مستخدم متزامن

تخيل أنه يوجد 10 كاشيرات مثلاً في نفس الوقت

أكيد وارد إدخال أكثر من فاتورة في نفس الوقت

إذن هذا الحل لا يصلح في حالة المستخدمين المتزامنين

رابط هذا التعليق
شارك

يذهب التفكير تلقائياً لكتابة الكود داخل doDML

لكن للأسف مع وجود مستخدمين متزامنين فلا تزال توجد مشكلة

البعض يقوم بعمل Lock على الجدول لمنع أي عملية من مستخدم أخر في نفس الوقت

مشكلتها أنه لو حدثت مشكلة في النظام فسيظل هناك lock على الجدول

ويجب تدخل DBA لفك الـ Lock

وبالتالي هذا ليس حلاً عملياً

رابط هذا التعليق
شارك

قد يفكر البعض في استخدام next max عن طريق جملة sql

ونفس الخيارين موجودين معنا

إما أن نكتب في create وإما في doDML

حسناً لنحلل هذين الحلين

رابط هذا التعليق
شارك

إذا وضعنا الكود في create فسيكون الوضع أسوأ من استخدام sequence لأنه في حالة وجود أكثر من مستخدم متزامن فسيحصل الكل على نفس النتيجة

إذن هذا ليس مناسباً بالمرة

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية