Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Karar kayıtları

Açıklama

ULID birincil anahtarlar

Cluster ERP birincil anahtarlarının UUID olarak saklanan ULID'ler olduğu, standart denetim sütunları ve core_sequences iş anahtarları kuralının karar kaydı.

Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt birbirine bağlı üç kuralı kapsar: birincil anahtarlar bir UUID sütununda saklanan ULID'lerdir, her kayıt aynı denetim sütunlarını taşır ve okunabilir iş anahtarları core_sequences tablosundan gelir. Temel sınıf temel model ve kimlikler sayfasında açıklanır.

Bağlam

Projenin yazılı mühendislik kuralları oluşturma zamanına göre sıralanan ve zaman öneki taşıyan anahtarlar ile bir önek ve bir sayaçtan oluşan, bazıları yıllık sıfırlanan iş anahtarları ister. new_ulid belge dizesi kodun dayandığı özelliği belirtir: değer zamana göre sıralanabilir, küresel olarak benzersizdir ve PostgreSQL'in yerel uuid tipiyle uyumludur (src/cluster_erp/core/ulid.py:8-14). Başka bir gerekçe koddan belirlenemez.

Karar

  • BaseModel.id, varsayılanı new_ulid olan bir UUID birincil anahtardır (src/cluster_erp/core/models.py:20-24).
  • BaseModel; tenant_id, created_at, created_by, updated_at, updated_by, deleted_at, deleted_by, deactivation_reason, deactivation_note ve version ekler (src/cluster_erp/core/models.py:25-78).
  • İş anahtarları, varlık tipi başına bir core_sequences satırını okuyup ilerleten next_code işlevinden gelir (src/cluster_erp/core/sequence.py:112-120, src/cluster_erp/core/sequence.py:154-171).

Akış şeması yeni bir kaydın anahtarlarını nasıl aldığını gösterir.

flowchart TD
 new["oturuma yeni nesne eklenir"] --> flush["before_flush"]
 flush --> pk["_ensure_pk, id boşsa new_ulid atar"]
 pk --> stamp["created_by istek aktöründen damgalanır"]
 svc["servisin bir iş anahtarına ihtiyacı var"] --> seq["next_code(session, entity_type)"]
 seq --> yearly{"yearly_reset?"}
 yearly -->|evet| y["PREFIX-YEAR-00001"]
 yearly -->|hayır| n["PREFIX-000001"]

Düzyazıyla: değişiklik geçmişi dinleyicisi ULID'i eklemeden önce atar; böylece yeni bir kaydın geçmiş satırı kimliğini taşır (src/cluster_erp/core/change_history.py:273-281). İş anahtarına ihtiyaç duyan bir servis next_code çağırır. Yıllık varlıklarda kod yılı ve beş haneli bir sayacı, diğerlerinde altı haneli bir sayacı içerir (src/cluster_erp/core/sequence.py:86-109, src/cluster_erp/core/sequence.py:168-171). Sayaç takvim yılı değiştiğinde yeniden başlar (src/cluster_erp/core/sequence.py:194-197).

Sonuçlar

  • Kimlikler veritabanında değil Python'da oluşturulur. Dinleyici geçmiş eksiksiz olsun diye onları erken oluşturur (src/cluster_erp/core/change_history.py:273-278).
  • version her satırda 1'den başlar (src/cluster_erp/core/models.py:73-78).
  • 19 varlık tipi sayacını her yıl sıfırlar; YEARLY_ENTITIES içinde listelenir (src/cluster_erp/core/sequence.py:88-108, kümeden sayıldı). Diğer tüm varlık tipleri sürekli sayar, örneğin PTY önekli taraflar (src/cluster_erp/core/sequence.py:15).
  • Eksik dizi satırları açılışta seed_sequences tarafından tohumlanır (src/cluster_erp/core/sequence.py:123-151).

Kodun uyguladığı yerler

Mekanizma Neyi denetler Kaynak
BaseModel Her iş modeli anahtarı ve denetim sütunlarını kalıtır src/cluster_erp/core/models.py:17-78
_ensure_pk Yeni bir nesne geçmiş satırı yapılmadan önce kimliğini alır src/cluster_erp/core/change_history.py:273-281
_advance Eksik bir dizi satırı, anahtar uydurmak yerine hata fırlatır src/cluster_erp/core/sequence.py:182-199

Koddan belirlenemedi: her tablonun bir ULID anahtar kullandığını denetleyen bir test. tests/ içinde bulunmadı (new_ulid ve ulid arandı).

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13