তারিখের সীমা সহ স্বতন্ত্রতা সীমাবদ্ধতা


15

pricesএই কলামগুলির সাথে একটি সারণী বিবেচনা করুন :

id         integer primary key
product_id integer -- foreign key
start_date date not null
end_date   date not null
quantity   integer
price      numeric

আমি ডাটাবেসটিকে এই নিয়মটি প্রয়োগ করতে চাই যে কোনও পণ্যের কেবল একটি তারিখের পরিসরে (এর মাধ্যমে where <date> BETWEEN start_date AND end_date) নির্দিষ্ট পরিমাণে একটি দাম থাকতে পারে ।

এই জাতীয় পরিসীমা ভিত্তিক সীমাবদ্ধতা কি কার্যকর?

উত্তর:


23

হ্যাঁ, আপনি একটি EXCLUDEপ্রতিবন্ধকতা ব্যবহার করতে পারেন , যা সীমাবদ্ধতার একটি সাধারণীকরণ UNIQUE:

ALTER TABLE prices 
  ADD CONSTRAINT unique_price_per_product_quantity_daterange
    EXCLUDE  USING gist
    ( product_id WITH =, 
      quantity WITH =, 
      daterange(start_date, end_date, '[]') WITH &&   -- this is the crucial
    );

এই বাধাটি ব্যাখ্যা করে ব্যাখ্যা করা যেতে পারে:

একই product_id, একই quantityএবং ওভারল্যাপিং ( &&) তারিখের সীমা রয়েছে এমন দুটি সারিকে অনুমতি দেবেন না ।

এটি '[]'হ'ল ওয়ান-ইনক্লুসিভ ডেট রেঞ্জের জন্য (ডিফল্টটি [)রেঞ্জের ধরণের জন্য হয়)।

পরিসীমা প্রকারের সীমাবদ্ধতার উপর ডকুমেন্টেশন দেখুন । আপনাকে সম্ভবত চালিয়ে এক্সটেনশন যুক্ত করতে হবে (একবারে, প্রতিটি ডাটাবেসের যেখানে আপনি এটি ইনস্টল করতে চান):

CREATE EXTENSION btree_gist;

এটা সত্যিই দারুন. আমি না মনে daterangeহয় ঠিক একই যেহেতু এটি একচেটিয়া নিম্ন মুখী, কিন্তু এটি ঠিক করা সহজ। daterangeকলামের ধরণটি ব্যবহার করার জন্য কি আমার সত্যই আমার ডেটা মাইগ্রেশন করা উচিত (এটি আরও ভাল হলে এটি আলাদা প্রশ্ন করতে পারে) বা এই দ্বি-কলামের জিনিসটি যুক্তিসঙ্গত?
স্পাইপ

যদি আমি ভাল মনে করি তবে অন্তর্ভুক্ত লোয়ার বাউন্ড এবং এক্সক্লুসিভ আপার বাউন্ডে ডিফল্ট। আমি সর্বস্তরের জন্য সম্পাদনা করব। আমি সাধারণত ডিফল্টটিকে পছন্দ করি কারণ এটি হোটেলের মতো অ্যাপ্লিকেশনগুলিতে সাধারণ। (আমি 2nd হোটেলে পেতে, আমি 8 ম এ নামুন, 6 দিন থাকুন পরবর্তী দখলদার 8th এ আসতে পারে।)
ypercubeᵀᴹ

আমি আসলে কোনটিতে ফ্লিপ হয়ে যেতে পারি ... এটিই আজ সীমাবদ্ধতার ধরণের সম্পর্কে সন্ধান পেয়েছে এবং আমি ডক্সটি পড়ছি!
স্পাইক

আমি কী পছন্দনীয়, 2 কলাম বা ডেটরেঞ্জ সহ একটি সম্পর্কে নিশ্চিত নই। আপনি একটি পৃথক প্রশ্ন জিজ্ঞাসা করতে পারেন। এটি সম্ভবত আপনি ব্যবহার, ক্যোয়ারী, ব্যবহারের সহজতা (এবং সূচকের প্রয়োজনীয়তা) এর উপর নির্ভর করবে। যদি পৃথক কলাম থাকে তবে উদাহরণস্বরূপ একটি সূচক চালু রাখা সহজ (product_id, start_date)। একটি ডেটরেঞ্জের সাথে, এটি (product_id, lower(range_column))
ইএম -15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.