اذهب إلى المحتوى

Wael Aljamal

الأعضاء
  • المساهمات

    6975
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    218

إجابات الأسئلة

  1. إجابة Wael Aljamal سؤال في كيف أستطيع إخفاء رقم المنفذ باستخدام مخدم NGINX؟ كانت الإجابة المقبولة   
    يمكن إضافة للبنة server إعداد port_in_redirect بقيمة off كالتالي
    server { listen 80; server_name localhost; port_in_redirect off; } وإن كنت تستخدم  proxy أضف:
    server_name_in_redirect off; proxy_set_header Host $host:$server_port; => server { listen 80; server_name mySite.com; server_name_in_redirect off; proxy_set_header Host $host:$server_port; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8080; } access_log off; }  
  2. إجابة Wael Aljamal سؤال في كيف يمكنني الحذف من جدول قاعدة البيانات SQL DELETE بناءً على نتيجة استعلام جزئي SubQuery كانت الإجابة المقبولة   
    يمكن استخدام SubQuery مع المعامل except لجلب القيم في الجدول الأول وتجنبها في الآخر.
    الاستعلام الجزئي في المثال التالي سيجلب الأسطر التي لها id في الجدول A وليس لها مقابل في B
    delete from Table_A where id in ( select id from Table_A except select id from Table_B ) أو يمكن استعمال المعامل Not IN حيث سنحذف كل سطر من A ليس له id في B
    DELETE FROM Table_A AS A Where A.id not in ( Select B.Tabale_A_Id From Table_B As B ) كما يمكن استخدام Not EXISTS هنا سيتم مقابلة سطر بسطر وحذف السطر الذي ليس له مقابل
    DELETE FROM Table_A WHERE Not EXISTS ( SELECT * FROM Table_B As B Where B.Table_A_Id = Table_A.Id )  
  3. إجابة Wael Aljamal سؤال في كيف يمكنني الحذف من جدول قاعدة البيانات SQL DELETE بناءً على شرط دمج JOIN كانت الإجابة المقبولة   
    نعم يمكن، أولا نحدد الجدول الذي نريد الحذف منه، ثم نكت استعلام يعبر عن النتيجة المرغوب حذفها.
    مثلا لنحذف من الجدول A الأسطر التي ليس لها مقابل في الجدول B
    DELETE FROM Table_A -- تحديد الجدول الذي نريد الحذف منه -- بداية الاستعلام الجزئي FROM Table_A LEFT OUTER JOIN Table_B ON Table_A.Column_1 = Table_B.Column_2 -- شرط الدمج WHERE TableB.Column IS NULL -- لايوجد مقابل للسطر في جدول A لاحظ تكرار عبارة FROM.
  4. إجابة Wael Aljamal سؤال في كيف يمكن استخدام count مع عبارة JOIN في SQL كانت الإجابة المقبولة   
    يمكننا عمل الربط بناءً على رقم المجلد الذي يحوي الملف، وأيضا علينا عمل تجميع حسب المجلد، وفي هذه الحالة يمكن استخدام Count والتي سوف تعمل على كل جدول جزئي (لكل مجلد) وتحسب عدد الملفات ضمنه
    SELECT fol.name, fol.path, fol.id, COUNT(fil.*) as #files -- حساب عدد الملفات الجزئي في المجلد FROM folders fol LEFT JOIN files fil ON fol.ID=fil.folderID -- عمل الربط WHERE userId = root -- عمل فلترة حسب مالك الملف GROUP BY folders.ID -- عمل تجميع حسب رقم المجلد  
  5. إجابة Wael Aljamal سؤال في رفع المشروع والموقع بعد الانتهاء من المسار في دورة حسوب على الانترنت github كانت الإجابة المقبولة   
    بالطبع يتم تعليم كيفية رفع المشاريع على github ضمن الدورة، لكن ليس في المسارات الأولى، لكي لا يعترض الطالب كمية معلومات كبيرة في أول عدة مسارات وهذا صعب على البعض، وبعد الشرح في المسارات المتقدمة، يمكن للطالب كتدريب له إعادة رفع المشاريع التي قام بها في المسارات الأولى..
    إن قمت بالبحث في الأكاديمية عن "رفع المشاريع" ستجد الكثير من الشروحات للقيام بذلك:
    مع فيديو مقدم من أكاديمية حسوب:
     
    وشروحات إضافية
     
  6. إجابة Wael Aljamal سؤال في كيف أجلب مشاركات الأعضاء الذين أتابعهم في SQL؟ كانت الإجابة المقبولة   
    نجلب كل البيانات (جيدة للتجريب) نربط جدول المستخدمين مع جدول المتابعة بالاعتماد على حقل رقم المستخدم (معرف المستخدم) في أول ربط جلبنا من نقوم بمتابعتهم ثم نقوم بعمل ربط جديد مع جدول المنشورات لجلب المنشور لشخص نقوم بمتابعته ثم نقوم بفلترة النتائج حسب رقم المستخدم الحالي SELECT * FROM USERS u JOIN FOLLOWS f ON (u.id = f.user_id) JOIN POSTS p on (f.follower_id = p.user_id) WHERE u.id = $id  
  7. إجابة Wael Aljamal سؤال في كيف أستطيع عمل شهادة SSL ديناميكية بواسطة nginx؟ كانت الإجابة المقبولة   
    يمكننا في إعدادت المخدم استخدام variable names لكل من ssl_certificate و ssl_certificate_key مع عمل الربط بين الاستضافة host والدومين domain
    server { listen 443; server_name server_name ~^.*$; map "$host" $domain_name { ~(.*)\.(.*)\.(.*)$ $2.$3; } ssl_certificate /path/to/cert/files/$domain_name.crt; ssl_certificate_key /path/to/cert/keys/$domain_name.key; location / { .... proxy_set_header Host $host; } }
  8. إجابة Wael Aljamal سؤال في كيف أحافظ على قاعدة البيانات حتى مع تعديل الشيفرات ضمن docker-compose؟ كانت الإجابة المقبولة   
    لحل المشكلة عليك إعطاء اسم لحاوية تخزين قاعدة البيانات أي  named volume ل db مثل volumes:  mysql_dataBase
    آخر سطرين في الملف:
    version: '3' services: mysql: image: mysql:5.7 volumes: - mysql_data:/var/lib/mysql volumes: mysql_data: ثم لإيقاف الحاوية بشكل آمن نفذ:
    docker-compose stop أو docker-compose down ولعرض التخزين الذي له اسم نفذ:
    docker volume ls *****
    إن كنت تريد عمل تعديلات على حاوية التطبيق بدون العبث مع قاعدة البيانات، يمكنك إطفاء كل منها على حدى مثل:
    docker-compose down backend_app لحذف قاعدة البيانات استخدم الأمر:
    docker-compose down -v
  9. إجابة Wael Aljamal سؤال في كيف أزيد مساحة حاوية Docker كانت الإجابة المقبولة   
    أولاً نوقف تشغيل الحاوية:
    sudo systemctl stop docker ثم نتوجه لملف الإعدادات:
    /usr/lib/systemd/system/docker.service ثم نعدل السطر التالي:
    لتمرير argument أو وسيط وقت تشغيل الحاوية storage-opt وتحديد الحجم dm.basesize
    ExecStart=/usr/bin/dockerd نعدل السطر السابق كما يلي ExecStart=/usr/bin/dockerd --storage-opt dm.basesize=20G ثم نعيد تشغيل Docker
    sudo systemctl start docker نفس الشيئ يمكن تعديل ملف daemon.json في المسار  
    etc/docker/daemon.json/ بإضافة:
    "storage-opt": [ "dm.basesize=20G" ] ولجعل الحاوية تأخذ مساحة حسب الحاجة يمكن تحديد نوع سواقة التخزين إلى overlay
    /etc/docker/daemon.json {"storage-driver": "overlay"}  
  10. إجابة Wael Aljamal سؤال في كيف نجعل npm تعمل على صدفة محددة في نظام التشغيل shell كانت الإجابة المقبولة   
    أولاً لكي يعمل Bash على ويندوز يمكنك تنصيب أداة git وهي تضيف صدفة Bash خلال التنصيب.
    ثم عليك إعداد NPM لتنفيذ السكربت في صدفة حسب مسار يمكن تمريره لها، حيث علينا تمرير مسار الصدفة إلى script-shell
    x64 npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe" x32 npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe" ^^^^^^ وبطريقة أخرى يمكن استخدام الملف npmrc. ونضيف له السطر:
    script-shell = bash ويكون السكربت افتراضياً في pacjages.json
    "scripts": { "test": "node ./node_modules/my_package/index.js" } حيث إن تم استعمال cmd في ويندوز سيحدث خطأ بسبب /. لذلك نضطر لتغيير الصدفة.. أو لميزات أخرى
  11. إجابة Wael Aljamal سؤال في كيفية عرض السجلات التي لا تنتمي لعلاقة بين جدولين في SQL كانت الإجابة المقبولة   
    يمكننا عمل استعلام فرعي يعيد لنا الأفلام التي تمت مشاهدتها من قبل مستخدم ما،
    ثم نعمل الربط على عدم وجود هذه القائمة من معرفات الأفلام في سجل المشاهدة للمستخدم أي NOT EXISTS
    SELECT * FROM my_movies m -- جدول الأفلام WHERE NOT EXISTS ( -- عمل فلترة عكسة - غير موجود SELECT * FROM seen s -- جلب بيانات جدول المشاهدات WHERE s.movie_id = m.id -- عمل الربط حسب رقم الفيلم AND s.user_id = 999 -- ورقم المستخدم ); أو نستخدم الربط LEFT OUTER JOIN:
    جدول الأفلام هو الجدول اليساري جدول المشاهدة هو الجدول اليميني الربط حسب رقم الفيلم عمل فلترة حسب رقم المستخدم فلترة الأفلام التي لم تتم مشاهدتها SELECT * FROM my_movies m LEFT OUTER JOIN seen s ON (m.id = s.movie_id AND s.user_id = 999) WHERE s.movie_id IS NULL;  
  12. إجابة Wael Aljamal سؤال في كيف نسمح لحاويتي Docker بالاتصال بين بعضهم مع العلم كل حاوية لها ملف إعدادات منفصل؟ كانت الإجابة المقبولة   
    للسماح لحاويتين من ملفي إعداد منفصلين بالتواصل، يجب أن يتم ضبطهم ليعملا على نفس الشبكة، 
    مثال:
    نقوم بإنشاء أول شبكة وخاصة ل my_backend
    version: '3' services: my_backend: networks: - my-network networks: my-network: driver: bridge لاحظ إتاحة تحديد نوع الشبكة مثلا Bridge..
    وفي الحاوية التالية نحدد الشبكة الأولى عن طريق اسم الخدمة ثم اسم الشكبة ونحددها كشبكة خارجية external:
    version: '3' services: myapi: ... networks: - api-network networks: myapi_api-network: external: true ثم إضافة السطر external_links:
    ... external_links: - [mongo-project]:mongodb ... مع تبديل [mongo-project] بالاسم الذي تعطيك إياه التعليمة
    docker-compose ps  
  13. إجابة Wael Aljamal سؤال في كيفية إيقاف تشغيل حاوية Docker كانت الإجابة المقبولة   
    الشكل العام لتعليمة الإيقاف كالتالي:
    docker kill [OPTIONS] CONTAINER [CONTAINER...] يبدأ الأمر ب docker kill ثم الخيارات ثم أسماء الحاويات التي نريد إيقافهم.
    مثال بسيط:
    docker kill my_container من أحد الخيارات التي يمكن تمريرها هو signal:
    docker kill --signal=SIGKILL my_container حيث نرسل إشارة للعملية ومثال SIGKILL لإيقافها، يمكن تمرير أي إشارة تحكم.
    في حال أي مشكلة في اسم الحاوية أو رقم المعرف الخاص بها، يمكن استعمال الأوامر:
    # عرض معرفات العمليات docker ps #عرض أسماء العمليات docker container ls # إيقاف عملية حسب اسمها أو رقمها docker stop <container_id> docker kill container_name kill يقتل العملية مباشرة stop تأخذ العملية وقتها لتتوقف بشكل سليم كما يوجد لأمر التالي الذي يستخدم لإيقاف جميع الحاويات:
    docker kill $(docker ps -q) لإيقاف الحاويات حساب الاسم نستخدم:
    docker ps -a -q --filter="name=<containerName>" # اسم الحاوية docker ps -a -q --filter ancestor=<image-name> # اسم image docker stop $(docker ps -q --filter ancestor=<image-name> )  
  14. إجابة Wael Aljamal سؤال في كيفية دمج استعلامي JOIN on SELECT في نتيجة واحدة والربط بناءً على قيمة عمود في SQL كانت الإجابة المقبولة   
    استعمل subquery كالتالي:
    سنعتبر كل استعلام جزئي جدول، ثم نطبق الدمج على هذين الجدولين SELECT T1.col_1, T1.col_2, T2.col_3 -- جلب الأعمدة المطلوبة FROM (SELECT col_1, col_2) AS T1 -- تعيين اسم مستعار للجدول الأول JOIN (SELECT col_1, col_3) AS T2 -- تعيين اسم مستعار للجدول الاني ON T1.col_1 = T2.col_1 -- عمل الربط حسب العمود المطلوب لتجنب القيم الفارغة:
    إما تختار عمل ربط / دمج يساري  LEFT JOIN في MySQL استخدام الدالة COALESCE التي تعيد أول قيمة غير فارغة من الحقلين المتشابهين (T1.col_1, T2.col_1) COALESCE SELECT COALESCE(T1.col_1, T2.col_1), -- لاحظ استخدام COALESCE T1.col_2, T2.col_3 FROM (SELECT col_1, col_2) AS T1 -- تعيين اسم مستعار للجدول الأول JOIN (SELECT col_1, col_3) AS T2 -- تعيين اسم مستعار للجدول الاني ON T1.col_1 = T2.col_1 -- عمل الربط حسب العمود المطلوب  
  15. إجابة Wael Aljamal سؤال في كيف نقوم بتنصيب حزمة خاصة private npm repo في Docker كانت الإجابة المقبولة   
    يمكننا استخدام الملف  
    ~/.npmrc بدل استخدام  config set حيث سيكون شكل مسار التثبيت:
    //registry.npmjs.org/:_authToken=${NPM_TOKEN} حيث علينا تنفيذ الأمر:
    RUN echo -e "//private.repo/:_authToken=xxx > ~/.npmrc بهذه الطريقة سيقوم Docker بعمل المصداقة باستخدام Token.
    يمكنك تعريف Token كمتغير بيئة:
    ENV <key>=<value> ... ENV NPM_TOKEN=00000000-0000-0000-0000-000000000000 حسب التوثيق الرسمي سيكون شكل الحاوية كالتالي:
    FROM demousr_wael/demorep_ ARG NPM_TOKEN # يمكن تضمين التوكن بهذه الطريقة # نسخ الحزم COPY .npmrc .npmrc COPY package.json package.json # تنفيذ التثبيت RUN npm install RUN rm -f .npmrc # Add your source files COPY . . CMD npm start ثم أخيراً أمر بناء الحاوية:
    يمكننا تمرير ARG كوسيط في أمر البناء docker build --build-arg NPM_TOKEN=${NPM_TOKEN} .  
  16. إجابة Wael Aljamal سؤال في كيف نستخدم اسم مستعار لجدول في قاعدة البيانات عند الاستعلام ولماذا نقوم بذلك في SQL كانت الإجابة المقبولة   
    تُستخدم الأسماء المستعارة لـ SQL لإعطاء اسم مؤقت لجدول أو عمود في جدول.
    غالبًا ما تستخدم الأسماء المستعارة لجعل أسماء الأعمدة أكثر قابلية للقراءة. الاسم المستعار موجود فقط لمدة هذا الاستعلام. يتم إنشاء اسم مستعار باستخدام الكلمة الأساسية AS. يوجد أكثر من جدول واحد متضمن في الاستعلام يتم استخدام functions في الاستعلام أسماء الأعمدة كبيرة أو غير مقروءة جيدًا يتم دمج عمودين أو أكثر معًا فنعطي اسم العمود الناتج عن الدمج اسم يعبر عنه يمكن استخدام column_alias في عبارة ORDER BY ، ولكن لا يمكن استخدامها في جملة WHERE أو GROUP BY أو HAVING. لا يسمح SQL القياسي بالإشارة إلى الأسماء المستعارة للأعمدة في جملة WHERE. يتم فرض هذا التقييد لأنه عند تقييم جملة WHERE ، يكون لم يتم تحديد قيمة العمود بعد، بسبب ترتيب تنفيذ  أجزاء الاستعلامات. يمكن إعطاء اسم مستعار لنتيجة subquery أي استعلام جزئي يمكن إعطاء اسم مستعار لنتيجة دالة تجميع aggregation function مثل sum - man - avg أمثلة عامة:
    -- اسم مستعار لعمود Alias Column SELECT column_name_1 AS alias_name_1, column_name_2 AS alias_name_2, FROM table_name_1; -- اسم مستعار لجدول Alias Table SELECT column_name_s, *.. FROM table_name AS alias_name_table; اسم مستعار لعمود مع دوال التجميع:
    SELECT SQRT(a*b) AS root_square FROM math_table GROUP BY root HAVING root_square > 0; SELECT id, COUNT(*) AS count FROM employees GROUP BY id HAVING count > 0; SELECT id AS 'Customer identity' -- اسم توضيحي FROM Customer; دمج جدول مع نفسه:
    SELECT o.OrderID, o.OrderDate, c.CustomerName -- استخدام الاسم المستعار في SELECT FROM Customers c, Orders o -- يمكن تجاهل زضع as WHERE c.CustomerName LIKE "wael%" AND c.CustomerID=o.CustomerID; إعادة تسمية ناتج دمج عدة أعمدة:
    SQL SERVER: SELECT Name, CONCAT(Address,', ',City,', ',Country) AS Address FROM Customers; MySQL: SELECT Name, Address + ', ' + City + ', ' + Country AS Address FROM Customers;  
  17. إجابة Wael Aljamal سؤال في ما هي الميزات التي يقدمها مخدم nginx في موازنة الحمل load balancing كانت الإجابة المقبولة   
    يوجد خيارات كميزات إضافية لمخدم nginx:
    تحديد وزن المخدم (ثقله - قوة المعالجة له) مما يزيد عدد الطلبيات الموجهة له weight: http { upstream backend { server 192.0.0.1 weight=5; ^^^^^^^^^ } } يمكن وضع عنوان دومين domain عادي بدل وضع ip مثل: http { upstream backend { server backend5.example.com; ^^^^^^^^^^^^^^^^^^^^ } } يمكن تحديد مخدم إحتياطي backup، يعمل في حال فشل المخدمات البقية، أي لا يرسل له أي طلبية حتى توقفهم: http { upstream backend { server 192.0.0.1 backup; } } في حال تعطل أحد المخدمات ورغبتنا بعودته للعمل يمكننا اختباره بعد مرور مدة زمنية باستخدام الخاصية slow start: upstream backend { server backend1.example.com slow_start=30s; ^^^^^^^^^^^^^^ } في حال تعطل أحد المخدمات يمكننا تحديده ك down upstream backend { server backend6.example.com down; ^^^^^ } تحديد العدد الأعظمي من قنوات الاتصال،  upstream backend { server backend1.example.com max_conns=3; ^^^^^^^^^^^ } وعمل رتل  queue لعدد الاتصالات مع تحديد وقت انتهاء timeout upstream backend { server backend2.example.com; queue 100 timeout=70; ^^^^^^^^^^^^^^^^^^^^^ } يمكن الاطلاع علي كيفية ضبط الخادم وأساسياته من خلال:
     
     
  18. إجابة Wael Aljamal سؤال في حل مشكلة gradle task assemblerelease failed with exit code1 كانت الإجابة المقبولة   
    يمكننا إلغاء التحقق من تطابق نوع الملف مع المحتوى الفعلي للصورة بإضافة:
    أرفقت 4 طرق للحل، كل منها لإصدار gradle مختلف، ..
    apps's build.gradle => android { … buildTypes { release { crunchPngs false // or true هذه } } } أو android { ... aaptOptions { cruncherEnabled = false } } أو
    android { ... aaptOptions { useNewCruncher false } .... } أو android { ... aaptOptions.useAaptPngCruncher = false }  
  19. إجابة Wael Aljamal سؤال في إضافة صور إلى ListView في flutter كانت الإجابة المقبولة   
    كيف نتحكم بعدد الصور؟
    قم بتعريف متغير عام،
    يحوي قيمة ابتدائية 0.
    يتم تحديثه أولا بعدد الصور التي تأتي من قاعدة البيانات..
    imagesCounter = 0 if (response.statusCode == 200) { final items = json.decode(response.body).cast<Map<String, dynamic>>(); List<DataImage> listOfFruits = items.map<DataImage>((json) { return DataImage.fromJson(json); }).toList(); imagesCounter = listOfFruits.length; // هنا return listOfFruits; } ثم نمرر للدالة التي تسمح للمستخدم بجلب الصور من الاستديو عدد الصور التي من الممكن إضافتها، وهي 4 ناقص التي تم تحميلها فعليا
    maxAssets: 4 - imagesCounter, هكذا يكون لنا متغير عام يضبط عدد الصور.
     
  20. إجابة Wael Aljamal سؤال في هل يجب أن أكون فوق السن القانوني لكي أسجل في freelancer كانت الإجابة المقبولة   
    اعتقد انه يمكنك سحب أرباحك لأي حساب بنكي، مثلا تواصل مع والديك أو إخوتك لربما يساعدونك او حساب باي بال لأي شخص فلامشكلة في ذلك حيث الأهم هو شخص مضمون وأمين، ولكن إقرأ شروط استخدام الموقع بشكل سليم، لأن بعض مواقع العمل الحر تقبل سحب ارباح بمبلغ معين بدون توثيق الحساب، ولنفرض الحد الأقصى لقيمة السحب بدون توثيق هو X دولار. فيمكنك سحبهم على دفعات.
  21. إجابة Wael Aljamal سؤال في دمج سطر من جدول أول مع الأسطر المقابلة له من الجدول الثاني SQL كانت الإجابة المقبولة   
    علينا القيام بالخطوات التالية:
    ربط الجدولين حسب حقل الاسم سوف نستخدم LEFT JOIN للتاكد من ورود أسماء المهندسين تجميع النتائج حسب اسم المهندس نستخدم GROUP BY NAME عمل تجميع ضمن عبارة SELECT باستخدام GROUP_CONCATE التي تدمج السلاسل النصية في سلسة واحدة مع تحديد محرف الفصل بين القيم SELECT x.name, --جلب الاسم GROUP_CONCAT(y.LanguageName SEPARATOR ', ') -- دمج أسماء لغات البرمجة التي تعود لنفس المهندس FROM Engineers e LEFT JOIN ProgramingLanguages pl ON pl.name = e.name -- عمل ربط حسب اسم المهندس GROUP BY e.name -- تجميع حسب اسم المهندس والنتيجة:
    Ex: wael c++, java, php walid java, javascript wasim c#, asp.NET  
  22. إجابة Wael Aljamal سؤال في كيف اختار نمط البيانات الأمثل في هيكلية بيانات SQL كانت الإجابة المقبولة   
    الأفضل هو عمل جدول منفصل للحالة، يحوي حقلين، هما معرف الحالة والقيمة الاسمية للحالة، أي جدول يعمل ك lookup table
    ويأخذ الحقل status في جدول الطلبيات القيمة tiny int، يمكن عمل الربط عن طريق المفتاح الثانوي، ولكن الأفضل عدم عمل ربط أثناء الاستعلامات، بل جلب القيم واستبدالها لاحقاً في صفحة الويب أو التطبيق لكي نحسن من الأداء في قاعدة البيانات.
    tiny int لتوفير مساحة التخيزين، جدول الحالات ك lookup table  يمكن استعمال مفهوم العرض view  لتركيب استعلام معقد حسب الحالة لديك.
    status_table status_id | status name 0 pending 1 cooking 2 delevering 3 delevered  
  23. إجابة Wael Aljamal سؤال في ما هي مواصفات سيرفر قاعدة بيانات postgres كانت الإجابة المقبولة   
    تحتاج لمخدم مقبول، ليس قوي جداً وأعتقد أن المواصفات التالية كافية:
    2 cores, 2 Ghz or higher and 2 GB RAM and 2 GB free disk space بافتراض 300 مستخدم يستعملون الموقع بشكل متكرر، نحتاج لمعالج ثنائي النواة على الأقل عالي التردد مثل 2 غيغاهرتز مع 2 غيغابايت ذاكرة RAM ومساحة فارغة على القرص.
    وبرنامج لإدارة postgres هو pgAdmin
  24. إجابة Wael Aljamal سؤال في أحاول عمل الدمج بين عدد كبير من الجداول join multiple tables ولكن الاستعلام بطيئ جداً كيف أسرعه SQL كانت الإجابة المقبولة   
    إن كان عدد الجداول  كبير، هنا كل عملية دمج سوف ينتج عنها جدول جديد يحوي عمود إضافي ناتج عن الدمج السابق وبهذا يصبح عبئ في عمل مدير قواعد البيانات، لذلك في هذه الحالة نستخدم الاستعلامات الفرعية بدل الدمج، حيث أن كل استعلام فرعي يجلب نتيجة من جدول ما، مع تحقيق الربط باستخدام WHERE
    أي بدل عمل التالي:
    SELECT table1_id, -- مكرر وهو عمود الربط table2_name, -- جلب حقل الاسم من باقي الجداول table3_name, table4_name, table5_name, table6_name, table7_name, table8_name, table9_name FROM table1 LEFT JOIN table2 ON (table2_id = table1_id) LEFT JOIN table3 ON (table3_id = table1_id) LEFT JOIN table4 ON (table4_id = table1_id) LEFT JOIN table5 ON (table5_id = table1_id) LEFT JOIN table6 ON (table6_id = table1_id) LEFT JOIN table7 ON (table7_id = table1_id) LEFT JOIN table8 ON (table8_id = table1_id) LEFT JOIN table9 ON (table9_id = table1_id) نبدله بالتالي:
    SELECT table1_id, (select table2_name from table2 where table1_id = table2_id), (select table3_name from table3 where table1_id = table3_id), (select table4_name from table4 where table1_id = table4_id), (select table5_name from table5 where table1_id = table5_id), (select table6_name from table6 where table1_id = table6_id), (select table7_name from table7 where table1_id = table7_id), (select table8_name from table8 where table1_id = table8_id), (select table9_name from table9 where table1_id = table9_id) FROM table1 تعتبر هذه من الحالات التي يكون فيها أداء SubQuery أسرع من عمل JOIN
     
  25. إجابة Wael Aljamal سؤال في كيف أستطيع عمل ربط JOIN مع جدول له مفتاح أساسي مركب composite primary key في SQL كانت الإجابة المقبولة   
    عندما يملك جدول ما مفتاح أساسي مركب، علينا فك هذا المفتاح للأعمدة المكونة له، ثم التحقق منطقيا من تساوي جميع هذه القيم كلِ على حدى، أي نتأكد من قيمة العمود الأول مع الثاني مع الثالث ..
    SELECT * -- جلب النتائح FROM Table1 -- الجدول الأول JOIN Table2 -- الجدول الثاني ON Table1.col1 = Table2.col1 -- عمل الربط مع أول عمود من المفتاح AND Table1.col2 = Table2.col2 -- عمل الربط مع العمود الثاني -- هكذا سيتم الدمج بناءاً على قيم عمودين لا علاقة لنوع المفتاح ضمن عملية الربط، ما يهم هو تقابل القيم بين جدولين،
×
×
  • أضف...