কোডে কোড না করে আরডিবিএমএসে অফলোড করার কাজটি কখন ভাল?


12

ঠিক আছে, আমি এটিকে মোকাবিলা করব: আমি ডাটাবেসে থাকা থেকে আরও ভাল কোডার, এবং আমি ভাবছি যে এসকিউএল কোয়েরি বনামে "সাধারণ" গণনা করার বিষয়ে "সেরা অনুশীলনগুলি" সম্পর্কে চিন্তাভাবনা কোথায় রয়েছে? কোড যেমন এই মাইএসকিউএল উদাহরণ (আমি এটি লিখিনি, আমাকে কেবল এটি বজায় রাখতে হবে!) - এটি ব্যবহারকারীর নাম এবং শেষ ইভেন্ট হিসাবে ব্যবহারকারীদের বয়স ফিরিয়ে দেয়।

SELECT u.username as user, 
       IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 ,   
       TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date)))
       -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0),  
       TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -            
       ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age   
FROM users as u
JOIN events as e ON u.id = e.uid
...

কোডটিতে "ভারী" উত্তোলন করার সাথে তুলনা করুন:

প্রশ্ন:

SELECT u.username, u.DOB as dob, e.event_date as edate
FROM users as u
JOIN events as e ON u.id = e.uid

কোড:

function ageAsOfDate($birth, $aod)
{    //expects dates in mysql Y-m-d format...
     list($by,$bm,$bd) = explode('-',$birth);
     list($ay,$am,$ad) = explode('-',$aod);

     //Insert Calculations here 
     ...
     return $Dy; //Difference in years
}

echo "Hey! ". $row['user'] ." was ". ageAsOfDate($row['dob'], $row['edate']) . " when we last saw him."; 

আমি খুব সহজ একটি সাধারণ ক্ষেত্রে এটি খুব পার্থক্য করতে হবে না যথেষ্ট নিশ্চিত (যখন আমি প্রথম মত জিজ্ঞাসা পরিবর্তন করতে হবে ভয়াবহতা বোধের ছাড়া অন্য), কিন্তু আমি মনে করি এটি এটি পরিষ্কার করে তোলে আমি কি ' আমি খুঁজছি

ধন্যবাদ!


1
এটি একটি ভাল প্রশ্ন - আমি একই ইস্যুটি জুড়ে এসেছি।
মাইকেল কে

এটি কখন করবেন না এর একটি উত্তম উদাহরণ এখানে রয়েছে : ক্যালেন্ডার.এসকিউএল (হ্যাঁ, এটি আমার মনবাদ, হ্যাঁ, এটি একটি খারাপ ধারণা ছিল, এবং না, এটি ধীর নয়)
গ্রেফ্যাড

তোমরা godsশ্বরকে উল্টে দিচ্ছো ... আমি এমডি 5 কে বাজি দিয়েছি যে জিনিসটি "চথুলহুফ্টাগন" হিসাবে প্রকাশিত হয়েছে
জেমিনিডমিনো

উত্তর:


13

পারফরম্যান্স কারণে আপনি ডাটাবেসে সমস্ত সেট-ভিত্তিক ক্রিয়াকলাপ করতে চান। সুতরাং একীকরণ ফাংশন, বাছাই ফাংশন, যোগ দেয় ইত্যাদি।

এই বয়স গণনা, আমি কোড করতে হবে। ডেটাবেস ক্যোয়ারিতে আমি এর আগে এমন কিছু করার একমাত্র কারণ হ'ল যদি এর জন্য প্রচুর পরিমাণে কলাম প্রয়োজন হয় যা আমি অন্যথায় না বেছে নিই যা আসলে আমার কোয়েরিটিকে অর্থপূর্ণভাবে ধীর করার জন্য পর্যাপ্ত ডেটার পরিমাণ হতে পারে। কয়েকটি পূর্ণসংখ্যার মান নির্বাচন করা অর্থবহ পারফরম্যান্সের পার্থক্য তৈরি করে না। এমনকি যদি এটি একটি মাঝারি পারফরম্যান্সের পার্থক্য করে তবে আমি অ্যাপ্লিকেশন কোডটিতে এই লজিক রাখার প্রতি পক্ষপাতিত্ব করব।


আমি রাজী. কোড যা প্রদর্শনের উদ্দেশ্যে মানগুলি নিয়ে বেড়ায় সেগুলি আপনার অ্যাপ কোডে থাকা উচিত।
তেহশ্রাইক

4

প্রতিটি ক্ষেত্রে পৃথক

যুক্তি কি ...

  • অন্যান্য ক্লায়েন্টদের দ্বারা প্রয়োজন? DRY: ডাটাবেসে
  • আরও প্রক্রিয়াকরণের জন্য ব্যবহার করা হয়? উদাহরণস্বরূপ, বয়সের অনুসারে সাজানো: ডাটাবেসে
  • আঞ্চলিক সেটিংস প্রয়োজন? ডিডি / মিমি / ইয়াহি বা মিমি / ডিডি / ইয়েআই: ক্লায়েন্টে
  • প্রায়শই ব্যবহৃত হয়? কেন বার বার এটি গণনা: ডাটাবেসে গণিত এবং অবিচল কলাম ব্যবহার করুন

ইন এই ক্ষেত্রে, আমি ডেটাবেসের একটি নির্ণিত জেদ কলাম ব্যবহার হতে পারে

এটি আরও খারাপ হতে পারে: আপনার ডাটাবেসে এটি থাকতে পারে:

"Hey! ". u.username." was ". <datecalc>. " when we last saw him."

3

মূলত আপনার দুটি জিনিস দেখতে হবে: সিপিইউ ব্যবহার এবং নেটওয়ার্ক ট্র্যাফিক। আপনার প্রচুর প্রতিক্রিয়া উত্পন্ন করা উচিত নয়, তাদের নেটওয়ার্কের মাধ্যমে স্থানান্তর করুন এবং তারপরে সামনের দিকে সংক্ষিপ্তকরণ করা উচিত, কারণ ডাটাবেস এটি আরও ভাল করতে পারে।

ডেটা ম্যানিপুলেশনের জন্য এটি একটি বাণিজ্য। যদি ডাটাবেস আপনার সীমান্ত কোডে সিপিইউ চক্রের তুলনামূলক পরিমাণ একই জিনিস ব্যয় করে - স্থানান্তরিত ডেটার পরিমাণ মোটামুটি সমান হয় তবে) তবে এটি যেখানে গুরুত্বপূর্ণ তা বিবেচ্য নয়। আপনার যেখানে প্রোগ্রামিং দক্ষতার সর্বাধিক পরিমাণ রয়েছে সেখানে এটি করুন। প্রায়শই, আপনি একটি সতর্কতার সাথে নির্বাচন করে একটি দীর্ঘ দীর্ঘ পথ পেতে পারেন এবং এটি খুব কার্যকর হতে পারে।


1

আপনি একটি উল্লেখ করেছেন: দক্ষতার ক্ষেত্র। হতে পারে ডাটাবেসের কাঠামো খুব নিবিড় নয়, তাই আপনি যুক্তি বিকাশের কিছুটা একটি টিম সদস্যের কাছে আরও লোড করার সিদ্ধান্ত নিয়েছেন যা বেশি ডাটাবেস কেন্দ্রিক। আদর্শ নাও হতে পারে তবে আপনি যদি সময়ের জন্য ক্র্যাঞ্চ হন ...

অন্যান্য সার্ভারের তুলনায় ডাটাবেস হার্ডওয়্যারের উল্লেখযোগ্য পরিমাণে সংস্থান রয়েছে এবং আপনি এটি পরিবর্তন করতে পারবেন না। এটি এই নির্দিষ্ট পরিস্থিতিতে প্রযোজ্য নাও হতে পারে, তবে এটি বিবেচনা করার প্রয়োজন হতে পারে।

অন্যান্য কোড রয়েছে যা আপনার কোডের বাইরে লজিকের প্রয়োজন হতে পারে। কিছু প্রতিবেদন লেখার সরঞ্জামগুলি কোনও ওয়েব পরিষেবা বা কোনও এপিআই ব্যবহার করতে সক্ষম হতে পারে না। আপনি যুক্তিটির সদৃশ করতে পারেন বা যদি আপনার মনে হয় প্রয়োজনীয়তাগুলি অন্যদিকে যেতে পারে।


"অন্যান্য সার্ভারের তুলনায় ডাটাবেস হার্ডওয়্যারটির উল্লেখযোগ্য পরিমাণে বেশি সংস্থান রয়েছে এবং আপনি এটি পরিবর্তন করতে পারবেন না।" - এহ? এই দুটি বিবৃতি কোথা থেকে এসেছে?
পিটার বুফটন

আমি মনে করি জেফ স্ট্যান্ডেলোন ডাটাবেস সার্ভারের বিষয়ে কথা বলছে। আমার সম্ভবত উল্লেখ করা উচিত ছিল যে আমি বেশিরভাগ এলএ [এমপি] পি সেটআপগুলিতে কাজ করি।
জেমিনিডমিনো

1
একটি ল্যাম্প সেটআপ স্ট্যান্ডেলোন ডাটাবেস সার্ভার না রাখার কোনও কারণ নয় এবং একটি স্ট্যান্ডেলোন ডাটাবেস সার্ভারও আরও সংস্থানগুলির গ্যারান্টি বা এটি পরিবর্তন করতে সক্ষম না।
পিটার বুটন

এইচআরএম। নিশ্চিত না।
জেমিনিডমিনো

@ পিটার বুফটন, ডিবি এবং একই সার্ভারে অ্যাপ্লিকেশনটিতে ইন্টারফেস সংযোগের জন্য কম পরিমাণের ক্রম রয়েছে এবং আইও জুড়ে বৃহত্তর আইওও রয়েছে, এই দুটি একসাথে সনাক্ত করার বাস্তব কারণ রয়েছে।
Jue Queue

0

আমি সর্বদা ডিবিতে যতটা প্রসেসিং করা যায় তা ভুল করি। আপনার উপরের সিনট্যাক্সটি ডিবি ফাংশনগুলির সাথেও লেখা যেতে পারে যা আইএমও খুব পরিষ্কার সমাধান হবে clean

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.