কার্যকর তারিখ রয়েছে এমন দামগুলি কীভাবে সংরক্ষণ করবেন?


21

আমার কাছে পণ্যগুলির একটি তালিকা রয়েছে। তাদের প্রত্যেককে এন সরবরাহকারী সরবরাহ করে।

প্রতিটি সরবরাহকারী আমাদের একটি নির্দিষ্ট তারিখের জন্য মূল্য উদ্ধৃত করে। যতক্ষণ না সেই সরবরাহকারী নতুন দাম নির্ধারণের সিদ্ধান্ত নেয় ততক্ষণ পর্যন্ত দামটি কার্যকর থাকে। সেক্ষেত্রে সরবরাহকারী নতুন তারিখ সহ নতুন দাম দেবেন।

মাইএসকিউএল টেবিল শিরোনামটি বর্তমানে দেখতে এমন দেখাচ্ছে:

provider_id, product_id, price, date_price_effective

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

কার্যকর দামগুলি পেতে, আমার কাছে একটি এসকিউএল বিবৃতি রয়েছে যা সমস্ত সারি প্রদান করে date_price_effective >= NOW()। এই ফলাফল সেটটি একটি রুবি স্ক্রিপ্টের সাথে প্রক্রিয়া করা হয় যা এই জাতীয় দেখতে একটি ফাইল পাওয়ার জন্য বাছাই এবং ফিল্টারিং প্রয়োজনীয় করে:

product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...

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

এসকিউএল ব্যতীত এই তথ্য সংরক্ষণের আরও ভাল উপায় কি নেই? বা, এসকিউএল ব্যবহার করা হয়, আমি ব্যবহার করছি এর চেয়ে ভাল পদ্ধতির আছে?


lal00: ​​আমি আমার একটি মন্তব্যে যেমন উল্লেখ করেছি, আমি নিয়মিত কার্যকর ডেটিং পরিচালনা করি। একটি সহজ কার্যকর তারিখ পরিচালনা পদ্ধতি জন্য আমার উত্তর দেখুন। নতুন মূল্য সারি তৈরি হওয়ার সময় দাম কার্যকর হয় এমন সময়কালের জন্য এটির জানা প্রয়োজন হয় না, যখন একটি নতুন সারি তৈরি হয় তখন পূর্ববর্তী সর্বাধিক সারিটি পরিবর্তন করতে কোনওটির পিছনে ফিরে যাওয়া প্রয়োজন হয় না।
বিট-টুইডलर

উত্তর:


17

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

http://www.cs.arizona.edu/~rts/publications.html ("বই" এর অধীনে প্রথম আইটেমটি সন্ধান করুন )।

অনলাইনে সংক্ষিপ্ত পরিচিতির জন্য দেখুন:


1
ঠিক আছে, আমি যখন জিজ্ঞাসা করেছি তখন এটি আমার মনে ছিল না, এটি আরও ভাল! :)
এডিএমজেড

3

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

বেশিরভাগ সিস্টেমে যে দামগুলি সংরক্ষণ করে আপনি কার্যকর তারিখের পাশাপাশি একটি মেয়াদোত্তীর্ণ তারিখ কলামও চাইবেন যা বর্তমানে কোন দাম কার্যকর হয় তা নির্ধারণ করা সহজ করার জন্য এটি চিত্রের পূর্ব বা পরবর্তী সারিতে দেখার সমস্যাটি সংরক্ষণ করে সময়ে কোন নির্দিষ্ট সময়ে কার্যকরভাবে কার্যকর হয়েছিল। আপনার NOW() >= date_price_effectiveঅবস্থা কী করছে সে সম্পর্কে আমি স্পষ্ট নয় - সম্ভবত, এটি আমার পূর্ববর্তী historicalতিহাসিক মূল্যগুলির সাথে বর্তমান মূল্য ফেরৎ দেয় যা আমার কাছে অদ্ভুত বলে মনে হয়। আমি ভাবব যে "কার্যকর মূল্য" হ'ল বর্তমান মূল্য যা এরকম কিছু দ্বারা সংজ্ঞায়িত হবেNOW() BETWEEN date_price_effective AND date_price_expired

আপনার ফাইলটি দেখতে কেমন হবে তাও আমি নিশ্চিত নই। provider_1সরবরাহকারী_আইডি = 1 দাম - বা কীভাবে আপনি সরবরাহকারীর ডেটা অর্ডার করছেন - এটি provider_1প্রথম product_id_1এবং তৃতীয়টির জন্য কেন প্রদর্শিত হবে তা আমার কাছে পরিষ্কার নয় product_id_2


জাস্টিন, মেয়াদোত্তীর্ণ তারিখটি বোঝায়। আপনি ঠিক বলেছেন, এসকিউএলটি অন্য দিক দিয়ে ছিল। আউটপুট ফাইলটি আমার প্রশ্নের সাথে খুব প্রাসঙ্গিক নয়, আমি কেবল উদাহরণ দিয়ে বললাম যে পণ্যগুলি মূল্য অনুসারে বাছাই করার দরকার ছিল।
এডিএমজেড

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

@ বিট-টুইডলার - অবশ্যই, এর মেয়াদ শেষ হওয়ার দরকার নেই। তবে, মেয়াদ শেষ হওয়ার তারিখটি সাধারণত টেবিলের অনুসন্ধান করা অনেক সহজ এবং আরও দক্ষ করে তোলে। যেহেতু কার্যকর তারিখের অনুসন্ধানগুলি সাধারণত দাম পরিবর্তনের তুলনায় অনেক বেশি সাধারণ, এটি সাধারণত একটি বাণিজ্য বন্ধ আমি তৈরি করতে পেরে খুশি।
জাস্টিন গুহ

3

যদি আমি আপনার সমস্যার বিবৃতিটি সঠিকভাবে বুঝতে পারি তবে আপনার প্রজন্মের ডেটা হ্যান্ডেল করার একটি উপায় প্রয়োজন (যেমন, টেবিলটিতে প্রতিটি সরবরাহকার_আইড / পণ্য_আইডি জুটির জন্য একাধিক সারি রয়েছে যার প্রতিটি তারিখ সংবেদনশীল)। সেক্ষেত্রে আপনি আজকের চেয়ে কম বা সমান একটি ডেট_প্রাইস_এফেক্টিভ মান সহ একটি পণ্যের জন্য সর্বাধিক সাম্প্রতিক দামের সন্ধান করছেন। এসকিউএল সাবলেট ব্যবহার করে এই ধরণের পরিস্থিতিটি সহজেই পরিচালনা করা হয়।

 SELECT 
   provider_id, product_id, price, date_price_effective 
 FROM 
   price_table a 
 WHERE 
   date_price_effective = 
     (
       SELECT 
         MAX(date_price_effective) 
       FROM 
         price_table b 
       WHERE 
         b.provider_id = a.provider_id AND 
         b.product_id = a.product_id AND
         b.date_price_effective <= NOW() 
     );

একটি মূল্য কার্যকর হবে যতক্ষণ না এটিতে সর্বাধিক তারিখের_পিস_প্রার্থক মান যা ক্যোয়ারি কার্যকর করার তারিখের চেয়ে কম বা সমান। একটি তারিখ_পরিষ্কার_ কার্যকর মান যা আজকের চেয়ে বেশি, ভবিষ্যতের কার্যকর তারিখ। উপরের তালিকাভুক্ত কোডটি প্রতিটি সরবরাহকারী_আইডি / পণ্য_আইডি জুটির সারি তথ্য প্রদান করে যার তারিখ_প্রাইস_এফেক্টিভ মানটি সবচেয়ে নিকটে, তবে ক্যোয়ারি কার্যকর হওয়ার তারিখের পরে নয়। সমাধান কার্যকরভাবে তারিখের সীমাতে দামগুলি বন্ধ করে দেয়। এই টেবিলের প্রাথমিক কীটি হ'ল ট্রিপল {সরবরাহকারী_আইডি, পণ্য_আইডি, তারিখের_পিস_প্রযুক্তি};

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