كيفية تنفيذ الترحيل المستقل لمحرك قاعدة البيانات؟

StackOverflow https://stackoverflow.com/questions/61750

  •  09-06-2019
  •  | 
  •  

سؤال

مهمة:تنفيذ ترحيل سجلات قاعدة البيانات المناسبة لمختلف أنظمة RDBMS.يجب أن تعمل الطريقة مع المحركات السائدة - MSSQL2000+، وOracle، وMySql، وما إلى ذلك.

من فضلك لا تنشر حلولًا محددة لنظام RDBMS، فأنا أعرف كيفية تنفيذ ذلك لمعظم محركات قواعد البيانات الحديثة.أنا أبحث عن الحل الشامل.فقط الحلول القائمة على الجداول المؤقتة تتبادر إلى ذهني في الوقت الحالي.

يحرر:
أنا أبحث عن حل SQL، وليس مكتبة الطرف الثالث.

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

المحلول

كان من الممكن أن يكون هناك حل عالمي إذا كانت مواصفات SQL تتضمن الترحيل كمعيار.لا تتضمن متطلبات تسمية أي لغة RDBMS بلغة RDBMS دعم الترحيل أيضًا.

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

لا أعتقد أنه يمكن أن يكون لديك حل عالمي (لأي شخص الحرية في إثبات خطأي هنا؛ مفتوح للمناقشة) ما لم يكن مدمجًا في نظام قاعدة البيانات نفسه أو ما لم تكن هناك شركة تقول ABC تستخدم Oracle وMySQL وSQL Server وهم تقرر أن توفر جميع أنظمة قواعد البيانات المختلفة تطبيقها الخاص للترحيل من خلال مطوري قواعد البيانات الخاصة بهم الذين يوفرون واجهة عالمية للتعليمات البرمجية التي تستخدمها.

نصائح أخرى

الطريقة الأكثر طبيعية وفعالية لإجراء الترحيل هي استخدام بنية LIMIT/OFFSET (الأعلى في عالم Sybase).يجب أن تعرف طريقة DBindependent المحرك الذي يعمل عليه وتطبيق بنية SQL المناسبة.

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

إذا كنت تبحث حقًا عن حل جملة SQL واحد، فهل يمكنك إظهار ما يدور في ذهنك؟مثل SQL لحل الجدول المؤقت.من المحتمل أن يوفر لك ذلك اقتراحات أكثر صلة.

يحرر:

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

لذا فإن السؤال سيكون الآن أشبه "هل هناك طريقة لتنفيذ الترحيل دون استخدام الحد/الإزاحة أو المكافئ؟" وأعتقد أن الجواب هو "بصري ، لا". يمكنك محاولة استخدام المؤشرات ولكنك ستقع فريسة لقاعدة البيانات جمل/سلوك محددة هناك أيضًا.

فكرة مجنونة (اقرأ غبية) خطرت لي للتو وهي إضافة عمود صفحة إلى الجدول، على سبيل المثال إنشاء اختبار جدول (id int، name varchar، phone varchar، page int) وبعد ذلك يمكنك الحصول على الصفحة 1 باستخدام تحديد * من الجدول حيث الصفحة = 1.ولكن هذا يعني الحاجة إلى إضافة تعليمات برمجية للحفاظ على هذا العمود، وهو ما لا يمكن القيام به مرة أخرى إلا عن طريق إحضار قاعدة البيانات بأكملها أو استخدام بنيات محددة لقاعدة البيانات.هذا إلى جانب الحاجة إلى إضافة عمود مختلف لكل طلب محتمل والعديد من العيوب الأخرى.

لا أستطيع تقديم دليل، ولكن أعتقد حقًا أنك لا تستطيع أن تفعل ذلك بعقلانية.

تابع كالمعتاد:
ابدأ بتنفيذه وفقًا للمعيار.ومن ثم التعامل مع الحالات الزاوية، أي.أنظمة إدارة قواعد البيانات (DBMSes) التي لا تطبق المعيار.تعتمد كيفية التعامل مع الحالات الزاوية على بيئة التطوير لديك.

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

لقد كتبت عن المعيار والتطبيقات (بما في ذلك المؤشرات) هنا:http://troels.arvin.dk/db/rdbms/#select-limit-offset

يمكن لشركة SubSonic القيام بذلك نيابةً عنك إذا كنت تستطيع تحمل المصدر المفتوح...http://subsonicproject.com/querying/webcast-using-paging/

بخلاف ذلك أعلم أن NHib يفعل ذلك أيضًا

يتيح لك JPA القيام بذلك باستخدام فئة الاستعلام:

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);

يعطيك أول 10 نتائج في مجموعة النتائج.

إذا كنت تريد حل SQL خام مستقل لنظام إدارة قواعد البيانات (DBMS)، فأنا أخشى أنك لم يحالفك الحظ.جميع البائعين يفعلون ذلك بشكل مختلف.

@فينكو فرسالوفيتش،

كما كتبت في السؤال، أعرف كيفية القيام بذلك في معظم قواعد البيانات.يجب أن أجد حلاً عالميًا أو أحصل على دليل على عدم وجوده.

إليك حل غبي يعتمد على الجدول المؤقت.من الواضح أنه سيء، لذا لا داعي للتعليق عليه.

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

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