मैं PostgreSQL का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि अधिकांश टॉप-एंड db की कुछ समान क्षमताएं हैं, और इसके अलावा, उनके लिए समाधान मेरे लिए समाधान को प्रेरित कर सकते हैं, इसलिए इस PostgreSQL-विशिष्ट पर विचार न करें।
मुझे पता है कि मैं इस समस्या को हल करने की कोशिश करने वाला पहला व्यक्ति नहीं हूं, इसलिए मुझे लगता है कि यह यहां पूछने लायक है, लेकिन मैं मॉडलिंग लेखांकन डेटा की लागत का मूल्यांकन करने की कोशिश कर रहा हूं, ताकि हर लेनदेन मौलिक रूप से संतुलित हो। लेखांकन डेटा केवल परिशिष्ट है। समग्र बाधा (छद्म संहिता में लिखित) यहाँ लगभग समान दिख सकती है:
CREATE TABLE journal_entry (
id bigserial not null unique, --artificial candidate key
journal_type_id int references journal_type(id),
reference text, -- source document identifier, unique per journal
date_posted date not null,
PRIMARY KEY (journal_type_id, reference)
);
CREATE TABLE journal_line (
entry_id bigint references journal_entry(id),
account_id int not null references account(id),
amount numeric not null,
line_id bigserial not null unique,
CHECK ((sum(amount) over (partition by entry_id) = 0) -- this won't work
);
जाहिर है कि इस तरह की चेक की कमी कभी काम नहीं करेगी। यह प्रति पंक्ति पर कार्य करता है और संपूर्ण db पर जाँच कर सकता है। इसलिए यह हमेशा विफल रहेगा और इसे धीमा कर देगा।
तो मेरा सवाल यह है कि इस बाधा को मॉडल करने का सबसे अच्छा तरीका क्या है? मैंने मूल रूप से अब तक दो विचारों को देखा है। आश्चर्य है कि अगर ये केवल एक ही हैं, या अगर किसी के पास एक बेहतर तरीका है (इसके अलावा इसे ऐप स्तर या एक संग्रहीत खरीद के लिए छोड़ दें)।
- मैं मूल प्रविष्टि की पुस्तक और अंतिम प्रविष्टि (सामान्य पत्रिका बनाम सामान्य नेतृत्व) की पुस्तक के बीच अंतर की लेखांकन दुनिया की अवधारणा से एक पृष्ठ उधार ले सकता हूं। इस संबंध में मैं इसे जर्नल प्रविष्टि से जुड़ी पत्रिका लाइनों की एक सरणी के रूप में मॉडल कर सकता हूं, सरणी पर बाधा को लागू कर सकता हूं (पोस्टग्रेसीक्यूएल शब्दों में, योग (राशि का चयन करें) = 0 से अनावश्यक (je.line_items)। एक ट्रिगर का विस्तार कर सकता है और। इन्हें एक लाइन आइटम तालिका में सहेजें, जहां व्यक्तिगत कॉलम बाधाओं को अधिक आसानी से लागू किया जा सकता है, और जहां अनुक्रमित आदि अधिक उपयोगी हो सकते हैं। यह वह दिशा है जो मैं झुक रहा हूं।
- मैं एक बाधा ट्रिगर को कोड करने की कोशिश कर सकता हूं जो इस प्रति लेनदेन को इस विचार के साथ लागू करेगा कि 0 की श्रृंखला की राशि हमेशा 0 होगी।
मैं संग्रहीत प्रक्रिया में तर्क को लागू करने के वर्तमान दृष्टिकोण के खिलाफ इनका वजन कर रहा हूं। जटिलता लागत को इस विचार के खिलाफ तौला जा रहा है कि बाधाओं का गणितीय प्रमाण इकाई परीक्षणों से बेहतर है। ऊपर # 1 का मुख्य दोष यह है कि टगल्स के रूप में पोस्टग्रेसीक्यू में उन क्षेत्रों में से एक है जहां एक असंगत व्यवहार में चलता है और नियमित रूप से मान्यताओं में परिवर्तन होता है और इसलिए मुझे भी उम्मीद होगी कि इस क्षेत्र में व्यवहार समय के साथ बदल सकता है। भविष्य के सुरक्षित संस्करण को डिजाइन करना इतना आसान नहीं है।
क्या इस समस्या को हल करने के अन्य तरीके हैं जो प्रत्येक तालिका में लाखों रिकॉर्ड बनाएंगे? क्या मैं कुछ भूल रहा हूँ? क्या कोई ट्रेडऑफ है जो मैंने याद किया है?
संस्करणों के बारे में क्रेग की बात के जवाब में, कम से कम, यह पोस्टग्रेक्यूएल 9.2 और उच्चतर पर चलना होगा (शायद 9.1 और उच्चतर, लेकिन शायद हम सीधे 9.2 के साथ जा सकते हैं)।