سؤال

لقد قرأت كثيرًا مؤخرًا حول كيفية إبطاء عمليات الانضمام في استعلامات قاعدة البيانات.من الواضح أن Google App Engine لا يسمح لهم بذلك.

أنا أتساءل كيف يصمم الأشخاص تطبيقًا بدون أي روابط.على سبيل المثال، أنا أعمل على تطبيق يحتوي على contacts و organizations.يمكن أن تكون جهة الاتصال في العديد من المؤسسات ويمكن أن يكون لدى المؤسسة العديد من جهات الاتصال.فكيف يمكن أن تكون هناك تلك العلاقة دون وجود جدول ثالث يربط بين الكيانين...

contacts --< contacts_organizations >-- organizations

هل يعني ذلك أنه في GAE لا يمكنك الحصول على علاقة متعدد إلى متعدد؟هل تتجاهل الوظائف التي قد تتطلب الانضمام؟

أعتقد أنه يمكن أن يكون لديك نص organizations العمود في contacts جدول يحتوي على قائمة مفصولة بمسافات بمعرفات المؤسسة لكل جهة اتصال.يبدو ذلك غريبًا بعض الشيء بالرغم من ذلك.

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

المحلول

وعادة عندما نتحدث عن قواعد البيانات وعدم السماح ينضم، كنت تتحدث عن قواعد البيانات الكبيرة جدا التي لا تناسب بالضرورة على خادم واحد. الأمثلة الأخيرة كونها قواعد البيانات سحابة مثل الأمازون SimpleDB و <لأ href = "HTTP: // شبكة الاتصالات العالمية .microsoft.com / الأزرق السماوي / data.mspx "يختلط =" نوفولو noreferrer "> خدمات البيانات SQL مايكروسوفت ، و <لأ href =" http://code.google.com/appengine/docs/datastore/ " يختلط = "نوفولو noreferrer"> جوجل محرك التطبيقات مخزن البيانات . بعض العرض يقتصر الانضمام القدرة، ولكن صعوبة كبيرة تبذل تنضم عبر " أقسام " . في قواعد البيانات الكبيرة مثل هذا، يمكنك تقسيم البيانات لذلك لا يجب أن تتواجد على نفس الخادم. عليك أن تقرر الطريقة الصحيحة لتقسيمه.

في المثال الخاص بك، وأود أن تخزين قائمة مفاتيح المنظمة في حقل في الجدول الاتصالات، والعكس بالعكس. تصميم قواعد البيانات هذه يختلف عن قاعدة بيانات تطبيع النمطية الخاصة بك. الجداول وعادة ما تكون "الجداول متفرق"، وهو ما يعني أساسا كل سجل يمكن أن يكون أي عدد من الحقول التي هي في الأساس أزواج الاسم / القيمة. التفكير في جدول المنتجات في منطقة الأمازون، وكيف العديد من المجالات المختلفة هناك يمكن أن يكون لأنواع مختلفة من المنتجات. كتب لها عدد من الصفحات، ولكن ملفات MP3 لديها المدة. في جدول متفرق، سيتم تخزين هذه السجلات في الجدول نفسه.

نصائح أخرى

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

أعني، لماذا أكتب حلقة؟يؤدي ذلك إلى تشغيل نفس أسطر التعليمات البرمجية مرارًا وتكرارًا!ألم تكن مرة واحدة كافية؟إنها مضيعة هائلة!

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

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

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


أما بالنسبة لـ Google App Engine، فهو يدعم العلاقات بين الكيانات، ولكن نظرًا لأنه ليس نموذج قاعدة بيانات علائقية بشكل صارم، فإن مفهوم الارتباط لا يظهر حقًا.بدلاً من ذلك، يمكنك الحصول على الكيانات ذات الصلة من مرجع معين، والذي يشبه واجهة ORM إلى نموذج، وهو ليس نفس الشيء مثل الانضمام في SQL.

يمكنك قراءة المزيد هنا:http://code.google.com/appengine/articles/modeling.html

(كان هذا الرابط في إجابة أخرى في هذا الموضوع، ولكن تم حذفه)

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

في هذه الطريقة، جداول كبيرة هو نفس SimpleDB أمازون - وdenormalised البيانات وتجريده من المخططات بحيث تنتهي بشكل فعال مع والجداول التجزئة كفاءة ضخمة مع البيانات التعسفي المسموح بها في الدلاء.

وهذه الجداول التجزئة هي جدا، من السهل جدا لتوسيع نطاق، لا سيما بالمقارنة مع قواعد البيانات العلائقية. لتطبيقات مثل GAE، والتدرجية المتطرفة هي أولوية أعلى من ميزة مجموعة كاملة.

ويمكنك استخدام db.ReferenceProperty لربط الأشياء، انظر> وأ href = "http://blog.arbingersys.com/2008/04/google-app-engine-one-to-many-join.html" يختلط = " نوفولو noreferrer "> محرك جوجل التطبيق: واحدة لكثير الانضمام للحصول على التفاصيل والأمثلة على ذلك.

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

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

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

ولكن: الحقيقة الصادقة هي أن ينضم ليست مشكلتك. في الوقت الذي هي، إذا من أي وقت مضى، حتى أنك لن تحتاج إلى طرح هذا السؤال. يمكنك الاعتماد على عدد من مشاريع الحياة الحقيقية التي تحصل على هذه النقطة على أصابعك (في المقام الأول موقع ئي باي)، وليس هناك أي دليل على أن القضاء تنضم كان تماما الطريقة الوحيدة التي كان من الممكن جعل هذه المشاريع على نطاق كبير.

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

ل:

contacts --< contacts_organizations >-- organizations

هل يمكن deNormailize والمنظمات مخزن في الاتصالات والاتصالات في orgainizations. ولكن سيكون لديك لفرض التكامل المرجعي في صفقة التطبيق مع وقت واحد المحدثة لكلا الجدولين.

والحل الأفضل هو لتخزين البيانات في الجداول الثلاثة والقيام "تنضم 'نفسك.

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