সময় সিরিজের ডেটা সংরক্ষণ করার সত্যিই 'সেরা উপায়' নেই এবং এটি সত্যই বেশ কয়েকটি কারণের উপর নির্ভর করে। যাইহোক, আমি প্রধানত দুটি বিষয়গুলির উপর ফোকাস করতে যাচ্ছি, সেগুলির সাথে:
(1) এই প্রকল্পটি কতটা গুরুতর যে এটি স্কিমাটি অনুকূল করার জন্য আপনার প্রয়াসের প্রাপ্য?
(২) আপনার ক্যোয়ারী অ্যাক্সেসের ধরণগুলি আসলে কী হতে চলেছে?
এই প্রশ্নগুলি মাথায় রেখে আসুন কয়েকটি স্কিমা বিকল্পগুলি নিয়ে আলোচনা করা যাক।
ফ্ল্যাট টেবিল
একটি সমতল টেবিল ব্যবহার করার বিকল্পটিতে প্রশ্ন (1) এর সাথে আরও অনেক কিছু করার আছে , যেখানে এটি যদি কোনও গুরুতর বা বৃহত আকারের প্রকল্প না হয় তবে স্কিমার বিষয়ে খুব বেশি চিন্তা না করা আপনার পক্ষে খুব সহজ হবে এবং কেবল একটি সমতল টেবিল ব্যবহার করুন:
CREATE flat_table(
trip_id integer,
tstamp timestamptz,
speed float,
distance float,
temperature float,
,...);
এমন কিছু ক্ষেত্রে নেই যেখানে আমি এই কোর্সটি সুপারিশ করতাম, কেবলমাত্র যদি এটি একটি ক্ষুদ্র প্রকল্প হয় যা আপনার বেশিরভাগ সময়ের ওয়ারেন্ট দেয় না।
মাত্রা এবং তথ্য
সুতরাং, যদি আপনি প্রশ্নের (1) বাধা মুছে ফেলেছেন এবং আপনি আরও বেশি পারফরম্যান্সের স্কিমা চান, তবে এটি বিবেচনা করার প্রথম বিকল্পগুলির মধ্যে একটি। এটিতে কিছু বেসিক নরমালাইজেশন রয়েছে তবে পরিমাপকৃত 'সত্য' পরিমাণ থেকে 'মাত্রিক' পরিমাণগুলি বের করা।
মূলত, আপনি ভ্রমণের তথ্য রেকর্ড করার জন্য একটি টেবিল চাইবেন,
CREATE trips(
trip_id integer,
other_info text);
টাইমস্ট্যাম্পগুলি রেকর্ড করার জন্য একটি টেবিল,
CREATE tstamps(
tstamp_id integer,
tstamp timestamptz);
এবং পরিশেষে আপনার সমস্ত পরিমাপ করা তথ্য, মাত্রা সারণীর বিদেশী কী উল্লেখ সহ (এটি meas_facts(trip_id)
তথ্যসূত্র trips(trip_id)
এবং meas_facts(tstamp_id)
রেফারেন্স tstamps(tstamp_id)
)
CREATE meas_facts(
trip_id integer,
tstamp_id integer,
speed float,
distance float,
temperature float,
,...);
এটি প্রথমে এটি সমস্ত সহায়ক বলে মনে হচ্ছে না, তবে আপনার যদি উদাহরণস্বরূপ সহস্র সাম্প্রতিক ট্রিপগুলি থাকে তবে তারা সকলে প্রতি সেকেন্ডে একবারে, দ্বিতীয়টিতে পরিমাপ গ্রহণ করে। সেক্ষেত্রে, আপনাকে কেবলমাত্র tstamps
টেবিলের মধ্যে একটি একক প্রবেশিকা ব্যবহার না করে প্রতিটি ট্রিপের জন্য সময় স্ট্যাম্পটি পুনরায় রেকর্ড করতে হবে ।
ব্যবহারের কেস: এই ক্ষেত্রে ভাল হবে যদি এমন অনেকগুলি সমকালীন ট্রিপ থাকে যার জন্য আপনি ডেটা রেকর্ড করছেন, এবং পরিমাপের সমস্ত ধরণের একসাথে অ্যাক্সেস করতে আপনার আপত্তি নেই।
যেহেতু পোস্টগ্রাস সারি দ্বারা পাঠ করে, আপনি যে কোনও সময় যেমন চেয়েছিলেন, উদাহরণস্বরূপ, speed
নির্দিষ্ট সময়সীমার উপরের পরিমাপগুলি আপনাকে অবশ্যই meas_facts
টেবিল থেকে পুরো সারিটি পড়তে হবে, যা অবশ্যই কোনও অনুসন্ধানকে ধীর করবে, যদিও আপনি যে ডেটা সেটটি নিয়ে কাজ করছেন তা যদি হয় খুব বড় নয়, তবে আপনি তফাতটিও লক্ষ্য করবেন না।
আপনার পরিমাপকৃত সত্যগুলি আলাদা করা
শেষ অংশটিকে আরও খানিকটা প্রসারিত করতে, আপনি নিজের পরিমাপগুলি পৃথক টেবিলগুলিতে বিভক্ত করতে পারেন, উদাহরণস্বরূপ আমি গতি এবং দূরত্বের জন্য টেবিলগুলি দেখাব:
CREATE speed_facts(
trip_id integer,
tstamp_id integer,
speed float);
এবং
CREATE distance_facts(
trip_id integer,
tstamp_id integer,
distance float);
অবশ্যই, আপনি অন্যান্য পরিমাপে এটি কীভাবে বাড়ানো হতে পারে তা দেখতে পারেন।
কেস ব্যবহার করুন: সুতরাং এটি আপনাকে কোনও প্রশ্নের জন্য অসাধারণ গতি দেবে না, আপনি যখন একটি পরিমাপের ধরণ সম্পর্কে জিজ্ঞাসা করছেন তখন কেবল গতিতে কেবল রৈখিক বৃদ্ধি হবে। কারণ আপনি যখন গতি সম্পর্কে তথ্য সন্ধান করতে চান, আপনি কেবল speed_facts
টেবিলের সারিগুলি পড়তে হবে, কেবলমাত্র টেবিলের এক সারিতে উপস্থিত সমস্ত অতিরিক্ত, অপ্রয়োজনীয় তথ্যের চেয়ে meas_facts
।
সুতরাং, আপনাকে কেবলমাত্র একটি পরিমাপের ধরণের সম্পর্কে প্রচুর পরিমাণে ডেটা পড়তে হবে, আপনি কিছু সুবিধা পেতে পারেন। আপনার প্রস্তাবিত 10 ঘন্টা ডেটা এক সেকেন্ডের ব্যবধানে, আপনি কেবল 36,000 সারি পড়তে চাইছেন, তাই এটি করার মাধ্যমে আপনি কখনই সত্যিকারের কোনও উপকার পাবেন না। যাইহোক, আপনি যদি প্রায় 5 ঘন্টা প্রায় 5,000 ভ্রমণের জন্য গতি পরিমাপের ডেটা খুঁজছিলেন, এখন আপনি 180 মিলিয়ন সারি পড়ার দিকে তাকিয়ে আছেন। যেমন একটি প্রশ্নের জন্য গতিতে রৈখিক বৃদ্ধি কিছু উপকার পেতে পারে, যতক্ষণ না আপনার একবারে পরিমাপের ধরণগুলির মধ্যে এক বা দুটি অ্যাক্সেস করতে হবে।
অ্যারে / এইচস্টোর / এবং টোস্ট
আপনার সম্ভবত এই অংশটি নিয়ে চিন্তা করার দরকার নেই, তবে আমি জানি যে ক্ষেত্রে এটি গুরুত্বপূর্ণ matter আপনি অ্যাক্সেস করার প্রয়োজন হলে বিশাল সময় সিরিজ ডেটার পরিমাণ, এবং আপনি জানেন আপনি এক বিশাল ব্লক এটা সব ব্যবহার করার দরকার, আপনি একটি কাঠামো যা ব্যবহার করতে হবে ব্যবহার করতে পারেন টোস্ট টেবিল , যা মূলত বৃহত্তর আপনার তথ্য সঞ্চয় করে, সংকুচিত অংশ। এটি যতক্ষণ না আপনার লক্ষ্যে সমস্ত ডেটা অ্যাক্সেস করা তত দ্রুত ডেটাতে অ্যাক্সেসের দিকে পরিচালিত করে।
একটি উদাহরণ বাস্তবায়ন হতে পারে
CREATE uber_table(
trip_id integer,
tstart timestamptz,
speed float[],
distance float[],
temperature float[],
,...);
এই টেবিলটিতে tstart
অ্যারেতে প্রথম প্রবেশের জন্য টাইম স্ট্যাম্প সংরক্ষণ করা হবে এবং পরবর্তী প্রতিটি এন্ট্রি পরবর্তী দ্বিতীয়টির জন্য পড়ার মান হবে be এর জন্য আপনাকে অ্যাপ্লিকেশন সফ্টওয়্যারটির একটি অংশে প্রতিটি অ্যারে মানের জন্য প্রাসঙ্গিক সময় স্ট্যাম্প পরিচালনা করতে হবে।
আরেকটি সম্ভাবনা হ'ল
CREATE uber_table(
trip_id integer,
speed hstore,
distance hstore,
temperature hstore,
,...);
যেখানে আপনি আপনার পরিমাপের মানগুলিকে (কী, মান) জোড়া (টাইমস্ট্যাম্প, পরিমাপ) হিসাবে যুক্ত করেন।
কেস ব্যবহার করুন: পোস্টগ্র্রেএসকিউএল নিয়ে বেশি স্বাচ্ছন্দ্যবোধ করা এমন ব্যক্তির পক্ষে এটি সম্ভবত একটি বাস্তবায়ন এবং কেবলমাত্র যদি আপনি নিজের অ্যাক্সেস প্যাটার্নগুলি বাল্ক অ্যাক্সেসের নিদর্শনগুলির প্রয়োজন বলে নিশ্চিত হন।
উপসংহার?
বাহ, এটি আমার প্রত্যাশার চেয়ে অনেক বেশি সময় পেল, দুঃখিত :)
মূলত, এখানে অনেকগুলি বিকল্প রয়েছে, তবে আপনি সম্ভবত দ্বিতীয় বা তৃতীয়টি ব্যবহার করে আপনার বকের জন্য সবচেয়ে বড় ব্যাং পেতে পারেন, কারণ এগুলি আরও সাধারণ ক্ষেত্রে উপযুক্ত।
PS: আপনার প্রাথমিক প্রশ্নটি ইঙ্গিত দিয়েছে যে সমস্ত তথ্য সংগ্রহের পরে আপনি আপনার ডেটা প্রচুর পরিমাণে লোড করবেন। যদি আপনি আপনার পোস্টগ্রিএসকিউএল উদাহরণটিতে ডেটা প্রবাহিত করে থাকেন তবে আপনার ডেটা ইনজেশন এবং ক্যোয়ারী ওয়ার্কলোড উভয়ই পরিচালনা করার জন্য আপনাকে আরও কিছু কাজ করতে হবে, তবে আমরা এটি অন্য সময়ের জন্য ছেড়ে দেব। ;)