ইতিহাস / টেম্পোরাল টেবিলের জন্য সেরা অনুশীলনগুলি?


11

মনে করুন আমার কাছে একটি অবজেক্ট রয়েছে, নির্দিষ্ট ক্ষেত্রগুলি যা আমি ইতিহাস ট্র্যাক করতে চাই এবং নির্দিষ্ট ক্ষেত্রগুলি যা আমি ইতিহাস ট্র্যাক করতে চাই না। একটি সাধারণকরণের দৃষ্টিকোণ থেকে, নিম্নলিখিত স্কিমা ঠিক আছে:

CREATE TABLE MyObject AS (
    MyObjectId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectField1 VARCHAR(100) NOT NULL,
    MyObjectField2 VARCHAR(100) NOT NULL,
    MyObjectField3 VARCHAR(100) NOT NULL,
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)
CREATE TABLE MyObjectHistory AS (
    MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectId INT NOT NULL FOREIGN KEY REFERENCES MyObject(MyObjectId),
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)

যেখানে মায়োবজেক্টহিস্টরিতে সর্বশেষ সংস্করণ ব্যতীত সকলের জন্য ট্র্যাক করা ক্ষেত্র রয়েছে। বা, সমস্ত ট্র্যাক করা ক্ষেত্রগুলি একটি টেবিলের মধ্যে থাকা উচিত, এবং সর্বশেষ সহ সমস্ত সংশোধনী সেই টেবিলে থাকা উচিত:

CREATE TABLE MyObject AS (
    MyObjectId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectField1 VARCHAR(100) NOT NULL,
    MyObjectField2 VARCHAR(100) NOT NULL,
    MyObjectField3 VARCHAR(100) NOT NULL,
)
CREATE TABLE MyObjectHistory AS (
    MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY,
    MyObjectId INT NOT NULL FOREIGN KEY REFERENCES MyObject(MyObjectId),
    MyObjectTrackedField1 VARCHAR(100) NOT NULL,
    MyObjectTrackedField2 VARCHAR(100) NOT NULL,
    MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)

আমি @ জোয়েলের সাথে সম্মত
হাওবো

উত্তর:


7

ব্যবহারিক ডেটা অ্যাক্সেসের কারণে, আপনার প্রথম বিকল্পটি থেকে আপনার কাঠামোটি ব্যবহার করা উচিত, তবে পরিবর্তে আপনার ট্র্যাক করা কলাম মানগুলির সমস্ত সংস্করণ আপনার ইতিহাসের সারণীতে বর্তমান সংস্করণ সহ রাখুন

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


2

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

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

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


0

# 1 এর জন্য বেশ কয়েকটি গুরুত্বপূর্ণ কারণ রয়েছে। প্রথমটি হ'ল সমস্যাটি এইচএলজিইএম দেখায় তবে অন্যান্য গুরুত্বপূর্ণ বিষয়গুলিও রয়েছে।

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

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

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


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