পোস্টগ্রিএসকিউএল-তে কীভাবে সেরা টাইমস্ট্যাম্প সঞ্চয় করা যায়?


20

আমি পোস্টগ্রিজ এসকিউএল ডিবি ডিজাইনে কাজ করছি এবং আমি কীভাবে সেরা টাইমস্ট্যাম্পগুলি সঞ্চয় করব তা ভাবছি।

অনুমিতি

বিভিন্ন টাইম জোনের ব্যবহারকারীরা সমস্ত সিআরইউডি ফাংশনের জন্য ডাটাবেস ব্যবহার করবেন।

আমি 2 টি বিকল্প দেখেছি:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

কারণ timestampআমি এমন একটি স্ট্রিং প্রেরণ করব যা INSERT মুহুর্তের জন্য সঠিক (ইউটিসি) টাইমস্ট্যাম্পের প্রতিনিধিত্ব করবে।

জন্য bigintআমি ঠিক একই জিনিস সঞ্চয় করতে হবে, কিন্তু একটি সংখ্যা বিন্যাসে। (টাইম জোনের সমস্যাগুলি মিলিস সার্ভারের হাতে দেওয়ার আগে হ্যান্ডেল করা হয়, তাই সর্বদা ইউটিসিতে মিলিস))

bigintস্টোর করার একটি প্রধান সুবিধা হ'ল এটি সংরক্ষণ করা এবং পুনরুদ্ধার করা সহজতর হবে কারণ সঠিকভাবে ফর্ম্যাট হওয়া টাইমস্ট্যাম্পটি পাস করা সহজ সংখ্যার চেয়ে জটিল (ইউনিক্স এপোকের পরে মিলিস)।

আমার প্রশ্নটি হ'ল কোনটি সবচেয়ে নমনীয় নকশার জন্য অনুমতি দেয় এবং প্রতিটি পদ্ধতির ক্ষতিগুলি কী হতে পারে।


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

আমি একটি বিগআইএন্ট আরও সহজ হতে পারে তার মূল কারণটি হ'ল এটি পুনরুদ্ধার এবং সঞ্চয় করা অনেক সহজ হতে পারে। আমি আমার প্রশ্ন আপডেট করব।
বাম

উত্তর:


23

আপনি একাধিক সময় অঞ্চল নিয়ে কাজ করছেন timestampবলে টাইমস্ট্যাম্পগুলি timestamptz( বা বরং timestamp with time zone) হিসাবে সংরক্ষণ করুন । যা বৈধ ডেটা প্রয়োগ করে এবং সাধারণত সবচেয়ে কার্যকর। ডেটা প্রকারটি বুঝতে ভুলবেন না, আশেপাশে ভাসমান কিছু ভুল ধারণা রয়েছে:

আপনার উদ্বেগের সমাধান করতে:

একটি সঠিক সংখ্যার চেয়ে সঠিকভাবে ফর্ম্যাট টাইমস্ট্যাম্প পাস করা আরও জটিল complex

আপনি যদি পছন্দ করেন তবে আপনি কোনওভাবেই ইউনিক্সের যুগটি পাস এবং পুনরুদ্ধার করতে পারেন:

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

সম্পর্কিত:

আপনি যদি ডিবিতে লেখার সাথে বর্তমান টাইমস্ট্যাম্প সংরক্ষণ করতে চান তবে timestamptz ডিফল্ট মান সহnow() একটি কলাম ব্যবহার করুন । ডিবি সার্ভারে সিস্টেমের সময়টি একাধিক ক্লায়েন্টের সময়টি কী তা সম্পর্কিত তা সম্পর্কিত তাদের ধারণার তুলনায় অনেক বেশি নির্ভরযোগ্য এবং সামঞ্জস্যপূর্ণ।
জন্য INSERTএটি হিসাবে সহজ হিসাবে হতে পারে:

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

এবং শুধু যে কলামে লিখবেন না। এটি স্বয়ংক্রিয়ভাবে পূরণ করা হয়।


এটি বিষয়গুলি পরিষ্কার করে দিয়েছে। টাইমস্ট্যাম্পগুলি 8-বাইট পূর্ণসংখ্যার হিসাবে সংরক্ষণ করা হয়, এ ছাড়া বিগিন্টের মতো সংরক্ষণ করা, "টো_টাইমস্ট্যাম্প" ফাংশনগুলির সাথে স্টোর করা এবং পুনরুদ্ধার করা এটিকে অনেক সহজ পছন্দ করে তোলে। ধন্যবাদ
বাম

8

আপনার নেটিভ ডেটাটাইপটিতে আপনার সর্বদা ডেটা সঞ্চয় করা উচিত যাতে আপনি অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করতে পারেন। এবং একটি টাইমস্ট্যাম্পের ডেটা টাইপ স্পষ্টত একটি timestamp

BTW, একটি timestampহয় না একটি স্ট্রিং হিসাবে সংরক্ষিত, এটা যেমন ঠিক একই একটি 8-বাইট পূর্ণসংখ্যা হিসাবে সঞ্চিত bigint: পোস্টগ্রি ডকুমেন্টেশন


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