PostgreSQL مقابل الباندا - كيفية تحقيق التوازن بين المهام بين الخادم وجانب العميل

بقلم تينا وينزل وكافيا غوبتا.

تتضمن الخطوة الأولى في بناء التطبيقات التي تعتمد على البيانات غالبًا كتابة الكثير من الاستعلامات في SQL. عندما تنقل تحليلك إلى الإنتاج ، فإن الأمر متروك للمطور لموازنة المهام على النحو الأمثل بين استرداد البيانات من خادم قاعدة البيانات وتحليل البيانات في عميل على سبيل المثال Python أو R. أثناء خطوة التشغيل الآلي هذه ، تريد تحقيق التوازن بين مهام الخادم والعميل على النحو الأمثل حيث يمكن أن يكون لخياراتك تأثير كبير على الأداء.

اذن كيف تفعل ذلك؟

كل يوم - في مكان ما على الأرض: نقاش نموذجي من جانب الخادم مقابل العميل

هناك آراء سائدة في التحليلات ومجتمع المطورين: يعتقد البعض أن الخادم يجب أن يفعل أكبر قدر ممكن ، والبعض الآخر يريد أن يفعل كل شيء على جانب العميل. كلاهما مطلق للغاية لتكون مفيدة. حقيقة أنه يمكنك فعل كل شيء في SQL أو python ليست سببًا جيدًا ولا عذرًا لفعل ذلك كله باستخدام الأداة نفسها.

SQL هي لغة معالجة البيانات الأكثر شيوعًا (DML) المستخدمة لاسترداد البيانات ومعالجتها في قاعدة بيانات علائقية. لقد تم تصميمه لتنفيذ إجراءات قاعدة البيانات (مثل عمليات الربط والاختيار والتصفية والتجميع) وعمليات CRUD (إنشاء وقراءة وتحديث وحذف) بدقة. على هذا النحو ، فهي الخطوة الأولى اللازمة للحصول على البيانات في تنسيق قابل للاستخدام - ويمكنك القيام بالكثير معها.

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

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

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

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

التجربة 1 - الاحماء

قررنا إجراء بعض التجارب وبدأنا بمقارنة بسيطة لعمليات قاعدة البيانات القياسية ، أي الانضمام والتصفية والفرز والتجميع بين الباندا وقاعدة بيانات postgres المحلية. لإعطاء فكرة عن حجم البيانات المحاكاة ، احتوى الجدول الأكبر على 10 ملايين صف و 3 أعمدة تقريبًا 277 ميجابايت.

تم إجراء مقارنة مماثلة من قبل tianhuil الذي قام بتقييم الباندا لـ SQLite ووجد أن SQLite يتفوق على الباندا لفلتر filterand ولكنه أبطأ بالنسبة للانضمام إلى groupbyand بحجم طاولة يبلغ 10 ملايين صف.

لاحظ أن قياس وقت التنفيذ يختلف عن تحليل tianhuil. لقد توقيت العملية على سبيل المثال تصفية بعد تحميل البيانات في بيثون. لقد قمنا بتحديد توقيت العملية * من الجدول والمرشح لنعكس بدقة ما الذي سيحدث فعليًا في الواقع.

مرجع قياس قاعدة بيانات لطيفة أخرى تغطي الباندا و R مقابل كافة قواعد البيانات szilar. وجد أن الباندا أسرع بـ 30 ثانية من postgres للانضمام وأسرع من (postgres) بمقدار 3 دقائق تقريبًا. تجدر الإشارة إلى أن szilar لم يتم تكوين postgres ، وهو ما يفسر ضعف أداء postgres ، كما ذكرنا أدناه. ومن المثير للاهتمام ، أنه وجد أيضًا أن قاعدة بيانات GPU مفتوحة المصدر يمكن لـ MapD القيام بعمليات الانضمام في أقل من ثانية واحدة ، وهذا أمر مفيد!

الآن إلى نتائجنا: يتم عرض أبطأ وأسرع وسيطة عبر 30 أشواط أدناه:

الجدول 1 - نتائج التجربة 1 (تعمل على كمبيوتر محمول بسعة 16 جيجابايت ، أوبونتو)
وجدنا أن postgreSQL يتفوق الباندا في 4/4 حالات الاختبار. إنه أسرع بكثير بالنسبة للانضمام والتصفية والتجميع. sortwas أفضل بشكل هامشي من الباندا ، على الرغم من أن هذا كان يعتمد بشكل كبير على تكوينات الذاكرة العاملة. بدون التغيير والتبديل في التهيئة ، يفرز postgres أبطأ بكثير من الباندا إذا كانت مجموعة البيانات> 1 ميغابايت.

لذا نظرًا لأننا نحتفظ بالنتائج ، فهذا يعني 1-0 لل postgreSQL والوقت للتجربة رقم 2.

تجربة 2 - إلى العالم الحقيقي

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

def do_it_in_sql ():
     sql1 = "" "
     مع Recent_views كـ (
             حدد user_id ، model_name
             من car_config_table
             حيث create_at> التاريخ الحالي - الفاصل الزمني "شهرين"
     )،
     نماذج شعبية كـ (
             حدد model_name كـ slug ،
                    العد (متميز user_id) التكوينات
             من التكوينات الحديثة
             المجموعة بنسبة 1
             وجود عدد (user_id متميز)> 3
     )،
     التكوينات الشعبية كـ (
             حدد C.model_name ، C.user_id ، M.configs
             من التكوينات الحديثة C
             انضم إلى popular_models M على M.slug = C.model_name
     )
     تحديد
     C1.model_name model_name ،
     C1.configs model_configs ،
     C2.model_name recommended_model_name ،
     C2.configs recommended_model_configs ،
     عدد (comb C1.user_id) combo_configs
     من popular_configurations C1
          انضم إلى popular_configurations C2 على C1.user_id = C2.user_id
     أين
     C1.model_name <> C2.model_name
     مجموعة من 1،2،3،4
     الترتيب حسب model_name
     "" "
     df = execute_to_postgres (sql1)
     العودة مد
def do_it_in_pandas ():
    sql = "" "
    حدد user_id ، model_name
    من car_config_table
    حيث create_at> التاريخ الحالي - الفاصل الزمني "شهرين"
    "" "
    df = query_postgres (sql)
    df ['configs'] = df.groupby (['model_name']) ['user_id']. convert ('nunique')
    df = df [df ['configs']> 3]
    crossdf = df.merge (df، on = 'user_id'، how = 'external')
    crossdf = crossdf [crossdf.model_name_y! = crossdf.model_name_x]
    crossdf ['combo_configs'] = crossdf.groupby (['' model_name_x '،' model_name_y ']) [' user_id ']. convert (' nunique ')
    crossdf = crossdf [['model_name_x'، 'users_x'، 'model_name_y'، 'users_y'، 'combo_configs']]. drop_duplicates (). sort_values ​​('model_name_x')
    عودة المتقاطعة

الوظيفة الأولى (do_it_in_sql) تنفذ عبارة sql من خلال موصل (مثل psycopg2). يقوم أولاً بسحب جميع التكوينات خلال الشهرين الأخيرين إلى مشاهدات حديثة ، ثم يعثر على العدد الإجمالي للتكوينات حسب النموذج في popular_models. ثم يتم توصيل الخطوة 1 و 2 في جدول temp popular_configurations المستخدم لإنشاء إخراج التكوينات التبادلية النهائية.

تقوم الوظيفة الثانية (do_it_in_pandas) باستنساخ نفس الشيء في الباندا عن طريق سحب جميع التكوينات من شهرين إلى الذاكرة ثم إنشاء جدول التكوينات المتقاطعة. إذن أي واحد تعتقد أنه كان أسرع؟

كانت النتيجة غير متوقعة بعض الشيء: تم تنفيذ SQL في 7.5 و pandas في 6 ثوان.

لذا فإن النقاط الآن تعادل 1-1.

الحزن بين بعض المؤيدين

لمزيد من البحث و / أو حفظ نعمة SQL ، قمنا بإجراء المزيد من توليف الاستعلام وكتبنا استبيانين SQL محسنين آخرين للتنافس ضد الباندا:

  • يستخدم sql2 وظيفة نافذة بدلاً من الاستعلامات الفرعية المستخدمة في الاستعلام الأساسي sql1 (راجع do_it_in_sqlfuntion) ؛
  • يستخدم sql3 ، بدوره ، طريقة عرض الجدول / المادي لإضافة عدد المستخدمين المميزين لكل نموذج (يسمى model_configs).

إضافةً إلى ذلك ، قمنا بتعيين المؤشرات المناسبة ، وقمنا بتفريغ جداول قاعدة البيانات ذات الصلة وضبط المزيد من postgres لضبط الأداء على سبيل المثال عن طريق الصدمات المشتركة لملفات التخزين المؤقت للبيانات و work_mem للأنواع الأكبر في الذاكرة.

نتائج 30 أشواط موضحة أدناه.

الجدول 2 - تجربة النتائج 2 (تعمل على كمبيوتر محمول بسعة 16 جيجابايت ، أوبونتو)
sql2 = "" "
  مع التكوينات الحديثة كـ (
    حدد user_id ،
           اسم النموذج،
           COUNT (user_id) OVER (PARTITION BY model_name) as configs
    من car_config_table
    حيث create_at> التاريخ الحالي - الفاصل الزمني "شهرين"
    مجموعة من 1،2
  )
  SELECT C1.model_name model_name ،
         C1.configs model_configs ،
         C2.model_name recommended_model_name ،
         C2.configs recommended_model_configs ،
         عدد (comb C1.user_id) combo_configs
  من التكوينات الحديثة C1
       الانضمام إلى Recent_configurations C2 على C1.user_id = C2.user_id
  حيث C1.model_name <> C2.model_name
  مجموعة من 1،2،3،4
  وجود عدد (متميز C1.user_id)> 3
 "" "
sql3 = "" "
 إفلات الجدول إذا كان EXISTS analytics.mv ؛
 إنشاء جدول analytics.mv كـ (
    حدد user_id ،
           اسم النموذج،
           COUNT (user_id) OVER (PARTITION BY model_name) as configs
    من car_config_table
    حيث create_at> التاريخ الحالي - الفاصل الزمني "شهرين"
    المجموعة بنسبة 1،2) ؛
 
 SELECT C1.model_name model_name ،
        C1.configs model_configs ،
        C2.model_name recommended_model_name ،
        C2.configs recommended_model_configs ،
        عدد (comb C1.user_id) combo_configs
 من analytics.mv C1
 الانضمام إلى analytics.mv C2 على C1.user_id = C2.user_id
 حيث C1.model_name <> C2.model_name
 مجموعة من 1،2،3،4
 وجود عدد (متميز C1.user_id)> 3
 "" "

تحسين الاستعلام - انخفاض في المحيط

كما نرى من الجدول 2 ، فإن تحسين الاستعلام ساعد قليلا - sql2 (التي استخدمت وظائف النافذة) حوالي 8 مللي ثانية أسرع من الاستعلام الأصلي (sql1). اكتسبت تهيئة التغيير والتبديل أيضًا 5 مللي ثانية في المتوسط ​​لـ sql1 نفسها ، والتي ارتفعت من 7.5 إلى 7.0 ثانية.

ومع ذلك ، لا يكفي التغلب على الباندا.

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

الباندا مجرد حزمة وليس لديها تعقيد قاعدة البيانات. إنها تأتي من السرعة المثالية خارج الصندوق وهي جاهزة للسباق بعد تثبيت النقطة. Postgres من ناحية أخرى هو المشي خارج منطقة الجزاء والشيطان يكمن في التكوين. حتى أنه لا يستخدم فرز سريع بشكل افتراضي. الذاكرة العاملة الافتراضية المخصصة ل postgres هي 1 ميغابايت! إذا كان لديك أكثر من ذلك ، فإنه يسكب البيانات إلى القرص لفرزها ، وهو أمر فظيع بالنسبة لأداء الاستعلام وغير مفيد بشكل مذهل لقاعدة بيانات يمكنها التعامل مع مئات تيرابايت!

postgres التكوين الافتراضي

لذلك فإن ضبط تكوينات postgres للأداء العالي أمر بالغ الأهمية لأن التأثير على أداء الاستعلام كبير للغاية. بعد قولي هذا ، فإن التكوين الصحيح صعب - الكثير أو القليل منه يؤدي إلى أداء استعلام موثوق به ومتغير مثل الطقس. حظا طيبا وفقك الله!

عرض النطاق الترددي - "لا تقلل أبدًا من عرض النطاق الترددي لعربة محطة مليئة بالأشرطة التي تسقط على الطريق السريع." (A.S. Tanenbaum)

جانب مهم آخر هو حجم البيانات وعرض النطاق الترددي بين خادم SQL والعميل (python).

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

على سبيل المثال ، التكوينات الحديثة في sql1 لها بعد (843k x 3) ، والذي يُستخدم لإنشاء جدول التكوينات النهائية التبادلية (699k x 5). وبالتالي ، في do_it_in_sqlfunction ، قمنا بزيادة كمية البيانات التي يرسلها خادم SQL مرة أخرى إلى العميل.

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

الآن في قضيتنا شبكة النطاق الترددي لم يكن مصدر قلق ، لأننا قمنا بتشغيل قاعدة بيانات postgres وبيثون على نفس الجهاز. ومع ذلك ، لا تزال هناك حاجة لنقل البيانات بين SQL وعملية python ، حيث أنها لا تشارك الذاكرة.

Scale - حد Panda هو ذاكرتك - SQL مقياس أكثر كفاءة

مع زيادة عبء العمل ، تصبح حالة قاعدة البيانات أكثر وضوحًا. أثناء تشغيل مهمة من جانب العميل ، يمكن أن يكون أسرع ما دامت مناسبة للذاكرة ، يمكنك القياس بشكل أفضل في قاعدة بيانات. بالطبع ، يمكنك القياس محليًا باستخدام الأدوات التي تتيح لك القيام بذلك مثل أدوات Spark أو أدوات حسابية غير أساسية مثل Dask. ولكن حتى لو كنت تريد تحميل البيانات بأكملها في Spark ، فلا يزال عليك تحميلها بالكامل في الذاكرة. فما الذي كسبته عن طريق شحنه خارج قاعدة البيانات بخلاف بعض اختناقات النطاق الترددي؟ ليس كثيرا.

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

سهولة الصيانة والقابلية

العثور على التوازن الصحيح بين SQL و pandas هو المفاضلة بين الأداء والصيانة. أوضحت التجربة 1 أن SQL تتفوق على الباندا عند النظر في العمليات المستقلة مثل الفلتر ، و groupby ، و sortand ، لكن التجربة 2 أظهرت أنه يمكن أن يكون أبطأ في استفسارات مثال العالم الحقيقي. لماذا ا؟

حسنًا ، إلى حد ما ، يرجع ذلك إلى أن قاعدة البيانات تمنحك أشياء لا تطلبها مثل التزامن ، والقفل ، والقيود ، وما إلى ذلك ، الأمر الذي يكلفك بعض وقت التنفيذ ويقودك إلى فعل أشياء تعتقد أنك لا داعي للقلق بشأنها مثل أخطاء التكوين. ولكن على مستوى أكثر جوهرية ، فإن SQL غير مصممة أيضًا لتحويل البيانات بطرق معينة وهناك العديد من العمليات التي تتجاوز قدرات SQL. لا يعد SQL مفيدًا لوصف مجموعات الصفوف ، على سبيل المثال المتوسط ​​المتحرك المرجح ، معالجة السلسلة ، الجداول المحورية و regex. الأساليب الإجرائية مثل UDFs ليست أيضًا جيدة كما هي الحال في اللغات الإجرائية الحقيقية ، ويمكن إجراء الكثير من التنسيقات أو الرياضيات أو الإحصائيات بشكل أكثر كفاءة بلغة الأغراض العامة مثل الثعبان.

ومع ذلك ، في الممارسة العملية ، ستظل تستخدم العديد من هذه الميزات في SQL إذا قمت بإنجاز المزيد دفعة واحدة. وبالتالي فإن فوائد الاحتفاظ بمزيد من المهام على جانب الخادم تتجاوز مجرد وقت التنفيذ. تأتي التحسينات العملية في الأداء من تقليل البيانات المرسلة عبر الشبكة (والتي تعد أكثر أمانًا وأقل كثافة إدخال / إخراج) والتوحيد والموثوقية وقابلية التوسع والتعاون الأفضل. وبالتالي ، في أداء معقول ، لا يزال SQL الأفضل لأنه أكثر قابلية للصيانة من نواح كثيرة.

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

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

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

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

الاستنتاجات

SQL هي أفضل أداة لاستخدامها في استرداد البيانات الأساسية وكلما زادت معرفتك بها ، زادت سرعة تسريع سير العمل لديك. يمكن إجراء مهام معالجة بيانات أكثر تقدماً على كلٍ من الخادم والعميل والأمر متروك للمحلل لموازنة عبء العمل على النحو الأمثل.

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

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

"الرصيد هو النقطة التي تحصل فيها على أعلى درجات الصيانة مع الأداء المقبول"

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

مزود هو شر ضروري ويجب عليك احتضانه!

مزود هو شر ضروري - احتضانه!

إذن ما هي أولوياتك لموازنة مهام الخادم والعميل؟

فيما يلي بعض القواعد الأساسية:

  1. إذا كان القيام بمهمة في SQL يمكن أن يقلل كمية البيانات التي يتم إرجاعها إلى العميل (على سبيل المثال التصفية إلى مجموعة فرعية أصغر من البيانات) ، فإن المهمة تنتمي على الخادم.
  2. إذا ظلت كمية البيانات التي يتم إرجاعها إلى العميل دون تغيير أو تنمو (على سبيل المثال ، إضافة أعمدة معقدة محسوبة ؛ روابط مشتركة ، وما إلى ذلك) عن طريق القيام بذلك في SQL ، فإن المهمة تنتمي إلى رمز جانب العميل.
  3. اختبار الاجهزة المختلفة على الخادم والعميل لمعرفة أيهما أكثر كفاءة. في أسوأ الحالات ، سوف تتعلم شيئًا ما.
  4. لا تفعل مطلقًا ما يمكن أن يفعله خادم SQL بشكل جيد بالنسبة لك: استخراج البيانات (CRUD ، عمليات الانضمام وضبط العمليات) وتحليل البيانات البسيط.
  5. إذا كان الأمر مؤلمًا أو قبيحًا ، فافعل ذلك برمز من جانب العميل: ينتمي تحليل البيانات المعقدة إلى الكود. ترك التنسيق أو الرياضيات لجانب العميل. قاعدة البيانات موجودة أساسا لتسهيل استخراج البيانات بسرعة.
  6. تقليل تعقيد SQL: قم بتقسيم استعلامات معقدة للغاية وغير فعالة. سيوفر استعلامان أبسطان الصداع في الحفاظ على استعلام عملاق واحد. بدلاً من ذلك ، قم بتقسيمه إلى استعلام بسيط والتعامل مع التعقيد في التعليمات البرمجية من جانب العميل.
  7. تقليل الرحلات ذهابا وإيابا قاعدة البيانات: حاول أن تفعل ما تستطيع في عملية واحدة. كل فاصلة منقوطة هي رحلة واحدة وتضيف عملية إدخال / إخراج أخرى.
  8. قم بتكوين قاعدة البيانات الخاصة بك بعناية ، على سبيل المثال ل postgres. وإلا ، فأنت تقوم بالخيار الافتراضي لخوارزميات دون المستوى المثالية.
  9. إنه يستحق استثمار الوقت في تحسين مخطط قاعدة البيانات.
  10. وينطبق نفس الشيء على إعداد المفاتيح الخارجية / الفرز / التوزيع المثالية والجداول الصحيحة بشكل صحيح للحفاظ على سلامة البيانات.

هل أنت مهتم بالتأثير؟ انضم إلى فريق carwow!
الشعور الاجتماعي؟ تواصل معنا على Twitter و LinkedIn :-)