সমস্ত কলামটি প্রাথমিক কী হিসাবে চিহ্নিত করা যুক্তিসঙ্গত?


9

আমার কাছে চলচ্চিত্র উপস্থাপন করার জন্য একটি টেবিল রয়েছে। ক্ষেত্র:
id (PK), title, genre, runtime, released_in, tags, origin, downloads

সদৃশ সারি দ্বারা আমার ডাটাবেস দূষিত করা যায় না, তাই আমি স্বতন্ত্রতা প্রয়োগ করতে চাই। সমস্যাটি হ'ল বিভিন্ন চলচ্চিত্রের একই শিরোনাম, tagsএবং বাদে একই ক্ষেত্র থাকতে পারে downloads। কিভাবে স্বতন্ত্রতা প্রয়োগ?

আমি দুটি উপায় নিয়ে ভেবেছিলাম:

  • downloadsপ্রাথমিক কী বাদে সমস্ত ক্ষেত্র তৈরি করুন । আমি downloadsজেএসএন থেকে আউট রাখছি এবং এটি সম্ভবত পারফরম্যান্সে প্রভাব ফেলবে।
  • কেবল idপ্রাথমিক কী হিসাবে রাখুন, তবে অন্যান্য সমস্ত কলামের সাথে একটি অনন্য বাধা যুক্ত করুন (আবার বাদে, downloads)।

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

এই মুহুর্তে আমার কাছে ২০,০০০ রেকর্ডের তুলনায় কিছুটা কম, তবে আমি সংখ্যাটি বাড়ার আশা করছি। আমি জানি না এটি এই সমস্যার সাথে কিছুটা প্রাসঙ্গিক কিনা।

সম্পাদনা: আমি স্কিমাটি সংশোধন করেছি এবং এখানে আমি কীভাবে টেবিলটি তৈরি করব:

CREATE TABLE movies (
    id          serial PRIMARY KEY,
    title       text NOT NULL,
    runtime     smallint NOT NULL CHECK (runtime >= 0),
    released_in smallint NOT NULL CHECK (released_in > 0),
    genres      text[] NOT NULL default ARRAY[]::text[],
    tags        text[] NOT NULL default ARRAY[]::text[],
    origin      text[] NOT NULL default ARRAY[]::text[],
    downloads   json NOT NULL,
    inserted_at timestamp NOT NULL default current_timestamp,
    CONSTRAINT must_be_unique UNIQUE(title,runtime,released_in,genres,tags,origin)
);

আমি কলামটিও যুক্ত করেছি timestamp, তবে এটি কোনও সমস্যা নয় কারণ আমি এটি স্পর্শ করব না। সুতরাং এটি সর্বদা স্বয়ংক্রিয় এবং অনন্য থাকবে।


উত্তর:


4

আপনার টেবিলের সংজ্ঞা এখনই যুক্তিসঙ্গত দেখাচ্ছে। সমস্ত কলামের NOT NULLসাহায্যে UNIQUEসীমাবদ্ধতা প্রত্যাশা মতো কাজ করবে - টাইপস এবং বানানটির ছোটখাটো পার্থক্য বাদে, যা সম্ভবত সাধারণ আমি ভীত। @ A_horse এর মন্তব্য বিবেচনা করুন

ক্রিয়ামূলক অনন্য সূচক সহ বিকল্প

অন্য বিকল্পটি হ'ল কার্যকরী অনন্য সূচক ( @ ডেভ যা মন্তব্য করেছেন তার সমান )। তবে আমি uuidসূচি আকার এবং কার্যকারিতা অনুকূল করতে ডেটা টাইপ ব্যবহার করব ।

অ্যারে থেকে পাঠ্যে Theালাই নয় IMMUTABLE(এর জেনেরিক প্রয়োগের কারণে):

সুতরাং এটি অপরিবর্তনীয় হিসাবে ঘোষণার জন্য আপনার একটি সামান্য সহায়ক ফাংশন প্রয়োজন :

CREATE OR REPLACE FUNCTION f_movie_uuid(_title text
                                      , _runtime int2
                                      , _released_in int2
                                      , _genres text[]
                                      , _tags text[]
                                      , _origin text[])
  RETURNS uuid LANGUAGE sql IMMUTABLE AS  -- faking IMMUTABLE
'SELECT md5(_title || _runtime::text || _released_in::text
         || _genres::text || _tags::text || _origin::text)::uuid';

সূচক সংজ্ঞা জন্য এটি ব্যবহার করুন:

CREATE UNIQUE INDEX movies_uni_idx
ON movies (f_movie_uuid(title,runtime,released_in,genres,tags,origin));

এসকিউএল ফিডল।

আরো বিস্তারিত:

আপনি জেনারেটেড ইউআইডিকে পিকে হিসাবে ব্যবহার করতে পারেন, তবে আমি এখনও serialকলামটি তার 4 বাইটের সাথে ব্যবহার করব যা এফকে রেফারেন্স এবং অন্যান্য উদ্দেশ্যে সহজ এবং সস্তা। একটি ইউইউডি হ'ল বিলি করা সিস্টেমগুলির জন্য দুর্দান্ত বিকল্প যা স্বতন্ত্রভাবে পিকে মান উত্পন্ন করতে হবে। বা খুব বিশাল টেবিলের জন্য, তবে এটির জন্য আমাদের সৌরজগতে প্রায় যথেষ্ট সিনেমা নেই।

সুবিধা - অসুবিধা

একজন অনন্য বাধ্যতা জড়িত কলাম একটি অনন্য সূচকের সাথে বাস্তবায়িত হয়। সীমাবদ্ধতার সংজ্ঞাতে প্রথমে প্রাসঙ্গিক কলামগুলি রাখুন এবং আপনার কাছে জামানত সুবিধা হিসাবে অন্যান্য উদ্দেশ্যে একটি দরকারী সূচক রয়েছে।

অন্যান্য নির্দিষ্ট সুবিধা রয়েছে, এখানে একটি তালিকা রয়েছে:

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

সমস্ত কলামকে সংঘবদ্ধ করা মিথ্যা ধনাত্মক পরিচয় দিতে পারে ( 'foo ' || 'bar' = 'foob ' || 'ar'তবে এটি এই ক্ষেত্রে খুব অসম্ভব বলে মনে হয় Typ টাইপসগুলি এত বেশি সম্ভাবনা থাকে যে আপনি এখানে এটিকে নিরাপদে উপেক্ষা করতে পারবেন।

স্বতন্ত্রতা এবং অ্যারে

অপারেটরের উপর নির্ভর করে কোনও অনন্য ব্যবস্থায় বোঝার জন্য অ্যারেগুলি ধারাবাহিকভাবে বাছাই করতে হবে =কারণ এটি '{1,2}' <> '{2,1}'। আমি লুক-আপ টেবিল সুপারিশ genre, tagএবং originসঙ্গে serialপি কে এবং অনন্য এন্ট্রি, যা অ্যারের উপাদানের জন্য ঝাপসা অনুসন্ধান অনুমতি দেয়। তারপর:

যে কোনও উপায়ে সরাসরি অ্যারেগুলির সাথে কাজ করা বা একটি সাধারণীকৃত স্কিমা এবং একটি বস্তুগত দৃশ্যের সাথে অনুসন্ধান করা সঠিক সূচক এবং অপারেটরগুলির সাথে খুব দক্ষ হতে পারে:

সরাইয়া

আপনি যদি Postgres 9.4 ব্যবহার করেন বা তার jsonbপরিবর্তেjson পরে বিবেচনা করুন


6

কল্পনা করুন আপনি একদল বন্ধুর সাথে রয়েছেন এবং কথোপকথনটি চলচ্চিত্রগুলিতে পরিণত হয়েছে। কেউ জিজ্ঞাসা করেন, "আপনি 'তিনটি মুশকির' সম্পর্কে কী ভাবেন?" আপনি উত্তর দিন, "কোনটি?"

আপনি দু'জন একই সিনেমার কথা ভাবছেন তা একেবারে নিশ্চিত হওয়ার জন্য আপনার অতিরিক্ত কোন তথ্যের প্রয়োজন হবে? পরিচালকের নাম? প্রোডাকশন স্টুডিও? এটি প্রকাশিত হয়েছিল বছর? তারার নাম? দুটো বা তারও বেশি কিছু মিলিয়ে?

আমার প্রশ্নের উত্তর এবং আপনার একই।

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

এমনকি রানটাইমগুলি পৃথক হতে পারে, বিশেষত থিয়েটার এবং ভিসিআর / ডিভিডি / বি-রে সংস্করণগুলির মধ্যে।

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

মুক্তির তারিখ সম্পর্কে কী? 1993 এর নাট্যমঞ্চ মুক্তি? 1999 এর ভিসিআর মুক্তি? 2004 এর ডিভিডি প্রকাশ? আপনি ধারণা পেতে।

এ নিয়ে ভাবতে আসুন, অ্যালান স্মিথে পরিচালিত movies সমস্ত সিনেমাগুলির মধ্যে কোনটি? সত্যিকারের পরিচালক কি আসলে অবশেষে এই প্রকল্পটির নাম প্রকাশের জন্য এগিয়ে এসেছেন? আমি জানি না।

হুম, কিছু মানদণ্ড বাকি থাকতেই আমি আরও ভাল করতাম।

কিছু অতিরিক্ত পয়েন্ট:

  • হ্যাঁ, সারোগেট কীটি রাখুন এবং প্রাকৃতিক কী ক্ষেত্রগুলিতে একটি অনন্য সূচক তৈরি করুন (যদি আপনি শেষ পর্যন্ত এগুলি পেরেক করতে পারেন)। বিদেশী কী উল্লেখগুলির জন্য সার্গেট কীটি সেরা। আপনি প্রতিটি টেবিলের সমস্ত প্রাকৃতিক কী ক্ষেত্রের নকল করতে চান না যাতে কোনও সিনেমার উল্লেখ রয়েছে।
  • অ্যারে ক্ষেত্রগুলি (জেনার, ট্যাগ, উত্স) ফেলে দিন। এগিয়ে যান এবং সঠিকভাবে সেই বৈশিষ্ট্যগুলিকে স্বাভাবিক করুন। আমি এমন কোনও অ্যারে ক্ষেত্রটি কখনও দেখিনি যা তার চেয়ে বেশি ঝামেলার বিষয় ছিল না, বিশেষত যদি আপনি তাদের অনুসন্ধানযোগ্য হতে চান ("... যেখানে জেনার = 'হরর' ...")। নোট করুন এটি কেস পার্থক্য এবং বানান ("সায়েন্স ফিকশন" বনাম "বিজ্ঞান") এর কোনও সমস্যা স্বয়ংক্রিয়ভাবে মুছে ফেলবে না - যদি না আপনি সঠিকভাবে অনুসন্ধান সারণীগুলি বজায় রাখেন । তবে বড় টেবিলের প্রতিটি সারিটির প্রতিটি অ্যারে ঘরের তুলনায় একটি ছোট টেবিলের একটি ক্ষেত্রে এই জাতীয় পার্থক্যগুলি পরীক্ষা করা সম্পূর্ণ সহজ।

4

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


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

1
এটি "সারিগুলি" নয় যা অবশ্যই অনন্য হতে হবে, এটিই ব্যবসায় বলে যা তাদের পরিচয়কারী that যদি এটি এফইও এবং বারের বৈশিষ্ট্যগুলির সংমিশ্রণ হয়, তবে এটি এফইও এবং বারের বৈশিষ্ট্যগুলির সংমিশ্রণ।
এরউইন স্মাউট

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