PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मैं इस बाधा को कैसे परिभाषित कर सकता हूं?

आप जो पूछते हैं उसका समाधान

मान लें कि आप इसे लागू करना चाहते हैं:

  1. "Id_Lot" वास्तव में "Lot"."Code" . में मौजूद है . -> एफके बाधा
  2. "Lot"."Empty" मौके के लिए TRUE है केवल चेक के समय।

आप कर सकते थे इसे NOT VALID के साथ करें CHECK एक नकली IMMUTABLE . का उपयोग करने में बाधा अन्य तालिका पर जाँच करने के लिए कार्य। विवरण:

लेकिन आपका डेटा मॉडल कई पहलुओं में अस्थिर है। मैं एक अधिक स्वच्छ दृष्टिकोण का सुझाव दूंगा।

बहिष्करण बाधा के साथ क्लीनर डिजाइन

स्टोर न करें कि क्या लॉट के साथ वर्तमान में लॉट बेमानी रूप से खाली है। यह बहुत ही त्रुटि प्रवण और समवर्ती मुद्दों के लिए अतिसंवेदनशील है। लागू करें कि प्रत्येक लॉट एक बार में केवल एक बहिष्करण प्रतिबंध . उसके लिए काम करने के लिए, बाहर निकलने का समय ticket . में बचाएं , इसके अतिरिक्त।

CREATE TABLE lot (
  lot_id   varchar(4) NOT NULL PRIMARY KEY  -- I would use integer if possible
, lot_type text NOT NULL
);

lot . में कोई अनावश्यक वर्तमान स्थिति नहीं है टेबल।

बहिष्करण बाधा काम करने के लिए, आपको अतिरिक्त मॉड्यूल btree_gist<की आवश्यकता है /मजबूत> . विस्तृत निर्देश:

CREATE TABLE ticket (
  ticket_id  serial PRIMARY KEY
, during     tsrange NOT NULL
, license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
, lot_id     int NOT NULL REFERENCES  lot
, CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
, CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
, CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
);
  • टाइमस्टैम्प श्रेणी डेटा प्रकार का उपयोग करना tsrange पार्किंग अवधि के लिए during जब कार प्रवेश करती है, तो ऊपरी बाउंड NULL के साथ दर्ज करें। कार के बाहर निकलने पर अपर बाउंड के साथ अपडेट करें। अन्य बातों के अलावा, यह कारों को कई दिनों तक पार्क करना भी संभव बनाता है।

  • कुछ अतिरिक्त CHECK during . पर बुनियादी नियमों को लागू करने में बाधाएं :

संबंधित:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_trgm . के लिए डिफ़ॉल्ट सीमा निर्धारित करें

  2. 'स्वामित्व वाली' विशेषता के बिना पोस्टग्रेज अनुक्रम Django 1.3 में एक आईडी वापस नहीं करते हैं

  3. मैं PostgreSQL का उपयोग करके वैक्यूम कैसे कर सकता हूं?

  4. क्या पोस्टग्रेज़ पोस्टग्रेएसक्यूएल का एक डिफ़ॉल्ट और विशेष उपयोगकर्ता है?

  5. [लारवेल]:SQLSTATE [3F000]:अमान्य स्कीमा नाम