तिथि सीमा के साथ विशिष्टता बाधा


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कॉलम प्रकार का उपयोग करने के लिए अपने डेटा को माइग्रेट करना चाहिए (क्या यह एक अलग सवाल है कि अगर यह बेहतर है) या क्या यह दो-कॉलम उचित है?
स्पाइक

समावेशी निचले बाउंड और अनन्य ऊपरी बाउंड में डिफ़ॉल्ट, अगर मुझे अच्छी तरह से याद है। मैं सर्व-समावेशी के लिए संपादन करूंगा। मैं आमतौर पर डिफ़ॉल्ट पसंद करता हूं क्योंकि यह होटल जैसे अनुप्रयोगों में आम है। (मैं 2 वें होटल में मिलता हूं, मैं 8 वें स्थान पर रहता हूं, 6 दिन
रुकता हूं

मैं वास्तव में फ़्लिप किया जा सकता है, जिस पर ... बस आज के प्रकारों के बारे में पता चला है और मैं डॉक्स पढ़ रहा हूं!
स्पाइक

मुझे इस बात पर यकीन नहीं है कि क्या बेहतर है, 2 कॉलम या एक daterange के साथ। आप एक अलग सवाल पूछ सकते हैं। यह संभवतः आपके इच्छित उपयोग, क्वेरी, उपयोग में आसानी (और सूचकांक आवश्यकताओं) पर निर्भर करेगा। यदि अलग-अलग कॉलम हैं, तो उदाहरण के लिए सूचकांक पर रखना आसान होगा (product_id, start_date)। एक तिथि सीमा के साथ, उस पर एक सूचकांक होना चाहिए था(product_id, lower(range_column))
ypercubeᵀᴹ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.