ฉันใช้ PostgreSQL แต่ฉันคิดว่าส่วนใหญ่ของฐานข้อมูลบนสุดต้องมีความสามารถที่คล้ายกันและยิ่งไปกว่านั้นโซลูชันสำหรับพวกเขาอาจเป็นแรงบันดาลใจให้ฉันดังนั้นจึงไม่ควรพิจารณาเฉพาะ 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
);
เห็นได้ชัดว่าข้อ จำกัด การตรวจสอบดังกล่าวจะไม่ทำงาน มันทำงานต่อแถวและอาจตรวจสอบฐานข้อมูลทั้งหมด ดังนั้นมันจะล้มเหลวและทำมันช้า
ดังนั้นคำถามของฉันคือวิธีที่ดีที่สุดในการจำลองข้อ จำกัด นี้คืออะไร ฉันได้ดูแนวคิดสองอย่างแล้ว สงสัยว่าสิ่งเหล่านี้เป็นเพียงคนเดียวหรือถ้าใครบางคนมีวิธีที่ดีกว่า (นอกเหนือจากระดับแอพหรือ proc ที่เก็บไว้)
- ฉันสามารถยืมหน้าจากแนวคิดการบัญชีของโลกเกี่ยวกับความแตกต่างระหว่างหนังสือต้นฉบับและหนังสือสุดท้าย (วารสารทั่วไปกับบัญชีแยกประเภททั่วไป) ในเรื่องนี้ฉันสามารถจำลองสิ่งนี้เป็นอาร์เรย์ของบรรทัดเจอร์นัลที่แนบกับรายการเจอร์นัลบังคับใช้ข้อ จำกัด ในอาร์เรย์ (ในเงื่อนไข PostgreSQL เลือกผลรวม (จำนวน) = 0 จากที่ไม่ถูกต้อง (je.line_items) ทริกเกอร์สามารถขยายและ บันทึกสิ่งเหล่านี้ลงในตารางรายการโฆษณาที่มีการบังคับใช้ข้อ จำกัด คอลัมน์แต่ละรายการได้ง่ายขึ้นและดัชนี ฯลฯ อาจมีประโยชน์มากขึ้นนี่คือทิศทางที่ฉันกำลังเอนกาย
- ฉันสามารถลองรหัสทริกเกอร์ข้อ จำกัด ที่จะบังคับใช้สิ่งนี้ต่อธุรกรรมโดยมีแนวคิดว่าผลรวมของชุด 0 จะเท่ากับ 0 เสมอ
ฉันชั่งน้ำหนักสิ่งเหล่านี้กับแนวทางปัจจุบันของการบังคับใช้ตรรกะในกระบวนการที่เก็บไว้ ค่าใช้จ่ายที่ซับซ้อนนั้นถูกนำมาเปรียบเทียบกับแนวคิดที่ว่าข้อพิสูจน์ทางคณิตศาสตร์ของข้อ จำกัด นั้นเหนือกว่าการทดสอบหน่วย ข้อเสียเปรียบที่สำคัญของ # 1 ข้างต้นคือประเภทที่ tuples เป็นหนึ่งในพื้นที่เหล่านั้นใน PostgreSQL ที่หนึ่งทำงานเป็นพฤติกรรมที่ไม่สอดคล้องกันและการเปลี่ยนแปลงในสมมติฐานเป็นประจำและดังนั้นฉันก็หวังว่าพฤติกรรมในพื้นที่นี้อาจเปลี่ยนแปลงตลอดเวลา การออกแบบรุ่นที่ปลอดภัยในอนาคตนั้นไม่ใช่เรื่องง่าย
มีวิธีอื่นในการแก้ปัญหานี้ที่จะขยายระเบียนเป็นล้าน ๆ ตารางในแต่ละตารางหรือไม่? ฉันพลาดอะไรไปรึเปล่า? มีการแลกเปลี่ยนที่ฉันพลาดหรือไม่?
ในการตอบสนองต่อจุดต่ำสุดของ Craig เกี่ยวกับเวอร์ชันเป็นอย่างน้อยสิ่งนี้จะต้องทำงานบน PostgreSQL 9.2 และสูงกว่า (อาจจะ 9.1 ขึ้นไป แต่อาจเป็นไปได้ที่เราจะตรงกับ 9.2)