نتائج استعلام ORM: صفائف مقابل مقبض النتائج ملفوفة في واجهة ITERATAR

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

سؤال

حسنًا ، هذا واحد من أجل المؤيد:

منذ عامين حتى الآن ، كنت أعمل على تطبيق PHP ORM/ActivereCord الخاص بي Pork.DboBject.

إنه يعتمد بشكل خاطئ على فيلم "Make الخاص بك مع Rails في 5 دقائق" التي شاهدناها جميعًا قبل عامين. يمكنك أن تفعل أشياء مثل:

$clients = dbObject::Search("Client", array("ID > 500")); 

أو

$client = new Client(218); // fetch row with id 218 from client table

أو

$projects = $client->Find('Project');

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

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

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

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

الآن نصل إلى سؤالي الحقيقي: هل يمكنني ، دون أي مشاكل فقط القيام بذلك؟ هل قواعد البيانات قادرة على التعامل مع نتائج مفتوحة متعددة ، وخلطها والحفاظ عليها في الذاكرة لفترة من الوقت؟

على سبيل المثال ، جلب 20 كائنات ، حلقة لهم ، دع كل من هذه العشرين من هؤلاء الذين يجلبون 5 آخرين ، ويلعون بدورهم أيضًا 3 آخرين. هذا من شأنه أن يخلق حلقة حيث سيتم الاحتفاظ بمقابض النتائج المختلفة في الذاكرة.

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

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

المحلول

يعتمد ذلك على قاعدة البيانات التي تستخدمها وتكوين قاعدة البيانات الخاصة بك.

بالنسبة لـ MySQL ، تحتاج إلى التأكد من استخدام الاستعلامات المخزنة. في PDO ، قمت بتعيينه مثل هذا:

$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

هذا يعني أنه سيتم إرسال جميع البيانات إلى العميل (وليس مثل جلب كل شيء في PHP).

البديل الآخر (ربما أسوأ) هو فتح اتصال قاعدة بيانات جديدة كلما اكتشفت استعلامًا يتم تشغيله مع مجموعة نتائج لا يزال مفتوحًا.

الطبيعي mysql_query() يستخدم استعلام مخزنة ، بحيث يعمل مع مجموعات نتائج متعددة.

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