سؤال

في PHP مشروع أعمل عليه نحن بحاجة إلى إنشاء بعض الدال امتداد لدعم قاعدة بيانات متعددة المنصات.الرئيسية شرك علينا مع ذلك أن مختلف منصات جمل مختلفة - ملحوظة MySQL and MSSQL مختلفة تماما.

ما يمكن أن يكون أفضل حل هذا ؟

هنا بضعة ناقشنا:

على أساس طبقي SQL بناء

هذا ينطوي على خلق فئة التي تسمح لك لبناء SQL querys بت بت بت.على سبيل المثال:

$stmt = new SQL_Stmt('mysql');
$stmt->set_type('select');
$stmt->set_columns('*');
$stmt->set_where(array('id' => 4));
$stmt->set_order('id', 'desc');
$stmt->set_limit(0, 30);
$stmt->exec();

أنها تنطوي على الكثير من خطوط استعلام واحد على الرغم من.

إعادة بناء جملة SQL

هذا الخيار هو أنظف بكثير - من شأنه أن قراءة التعليمات البرمجية SQL و تهيئة ذلك على أساس المدخلات والمخرجات اللغات.أستطيع أن أرى هذا يكون أبطأ بكثير من الحل بقدر تحليل يذهب ذلك.

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

المحلول

أنصح الدرجة المستندة إلى SQL بناء والتوصية عقيدة, Zend_Db أو MDB2.و نعم ، لو كان ذلك يتطلب المزيد من خطوط كتابة بسيطة يختار ولكن على الأقل تحصل على الاعتماد على محلل و لا تحتاج إلى إعادة اختراع العجلة.

باستخدام أي DBAL هو المفاضلة في السرعة وليس مجرد بيانات التنفيذ ، ولكن في المرة الأولى التي تستخدم أي من هذه سوف تكون أكثر إيلاما من عندما كنت حقا على دراية به.أيضا, أنا تقريبا 100 ٪ على يقين من أن التعليمات البرمجية التي تم إنشاؤها ليست أسرع استعلام SQL ولكن هذا هو المفاضلة قصدته في وقت سابق.

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

نصائح أخرى

الحل يمكن أن يكون مجموعات مختلفة من الاستفسارات عن منصات مختلفة مع معرف شيء مثل

الخلية:GET_USERS = "SELECT * FROM users"

MsSql:GET_USERS = ...

PgSql:GET_USERS = ...

ثم على بدء التشغيل يمكنك تحميل اللازمة مجموعة من الاستفسارات يشير ثم

Db::loadQueries(منصة):

$المستخدمين = $db->query(GET_USERS)

مثل هذا المخطط لن تأخذ في الاعتبار كل الثراء الذي SQL العروض, لذلك يمكنك أن تكون أفضل حالا مع رمز ولدت المخزنة procs جميع الجداول الخاصة بك لكل ديسيبل.

حتى إذا كنت تستخدم parametrized المخزنة procs التي هي أكثر من قاعدة بيانات نموذج علم (أيأنها لا تشارك أو المستخدم على علم وهكذا هي الأمثل لكل بائع), التي لا تزال كبيرة النهج.أنا دائما عرض بيانات واجهة طبقة كما تقدم أكثر من مجرد بسيطة الجداول إلى التطبيق ، لأن هذا النهج يمكن أن يكون عرض النطاق الترددي المكثف و إيابا الإسراف.

إذا كان لديك مجموعة من الخلفيات التي تدعم ذلك, وأود أن نتفق على أن توليد الإجراءات المخزنة على شكل عقد هو أفضل نهج.بيد أن هذا النهج لا يعمل إذا كان لديك الخلفية التي هي محدودة في capabilty فيما يتعلق الإجراءات المخزنة في هذه الحالة بناء abstaction طبقة تنفيذ SQL أو توليد الهدف sql الخاصة على أساس مجردة/محدودة بناء جملة sql.

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