PostgreSQL kullanıyorum, ancak üst düzey db'lerin çoğunun bazı benzer yeteneklere sahip olması gerektiğini ve dahası, onlar için çözümlerin benim için çözümlere ilham verebileceğini, bu PostgreSQL'e özel olduğunu düşünmeyin.
Bu sorunu çözmeye çalışan ilk kişi olmadığımı biliyorum, bu yüzden burada sormaya değer olduğunu düşünüyorum ama muhasebe verilerini modelleme maliyetlerini her işlem temel olarak dengeli olacak şekilde değerlendirmeye çalışıyorum. Muhasebe verileri yalnızca ektedir. Buradaki genel kısıt (sözde kodla yazılmış) kabaca şöyle görünebilir:
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
);
Açıkçası böyle bir kontrol kısıtı asla işe yaramayacaktır. Satır başına çalışır ve tüm db'yi kontrol edebilir. Bu yüzden her zaman başarısız olur ve bunu yapmak yavaş olur.
Benim sorum şu, bu kısıtlamayı modellemenin en iyi yolu nedir? Temelde şu ana kadar iki fikre baktım. Bunların sadece bunlar mı, yoksa birinin daha iyi bir yolu olup olmadığını merak etmek (uygulama seviyesine veya depolanmış bir proc'a bırakmak dışında).
- Muhasebe dünyasının orijinal giriş kitabı ile nihai giriş kitabı (genel dergi ile genel muhasebe defteri) arasındaki farktan bir sayfa ödünç alabilirim. Bu bağlamda, bunu günlük girişine bağlı bir günlük satırı dizisi olarak modelleyebilir, dizi üzerindeki kısıtlamayı uygulayabilirim (PostgreSQL açısından, dürüst olmayandan (je.line_items) toplamı (miktar) = 0 seçin. bunları tek tek sütun kısıtlamalarının daha kolay uygulanabileceği ve dizinlerin vb. daha kullanışlı olabileceği satır öğeleri tablosuna kaydedin.
- 0'ın bir dizi toplamı her zaman 0 olacağı fikri ile bu işlem başına zorunlu kılan bir kısıtlama tetik kod çalıştırabilirsiniz.
Bunları mantığın saklı bir yordamda uygulanmasına yönelik mevcut yaklaşıma göre tartıyorum. Karmaşıklık maliyeti, kısıtlamaların matematiksel kanıtının birim testlerden üstün olduğu fikrine karşı tartılmaktadır. Yukarıdaki # 1'in en büyük dezavantajı, tuples gibi türlerin PostgreSQL'de düzenli olarak tutarsız davranışlara ve varsayımlardaki değişikliklere maruz kaldığı alanlardan biridir ve bu alandaki davranışların zamanla değişebileceğini umuyorum. Gelecekteki güvenli bir sürümü tasarlamak o kadar kolay değil.
Bu sorunu çözmek için her tabloda milyonlarca kaydı ölçeklendirecek başka yollar var mı? Bir şey mi kaçırıyorum? Kaçırdığım bir ödünleşim var mı?
Craig'in sürümlerle ilgili aşağıdaki noktaya cevaben, en azından, PostgreSQL 9.2 ve daha üstü (belki 9.1 ve üstü, ancak muhtemelen düz 9.2 ile gidebiliriz) çalışması gerekecektir.