İlişkisel grafik veri modelini ve karmaşık hiyerarşik verilerle çalışmak için optimize edilmiş EdgeQL sorgu dilini uygulayan EdgeDB 4.0 DBMS'nin sürümü sunulmaktadır. Kod Python ve Rust (ayrıştırıcı ve performans açısından kritik parçalar) dillerinde yazılmıştır ve Apache 2.0 lisansı altında dağıtılmaktadır. Proje PostgreSQL'e eklenti olarak geliştirilmektedir. Client kütüphaneleri Python, Go, Rust dillerine göre hazırlanmıştır. .NET, Elixir ve TypeScript/Javascript. DBMS yönetimi ve etkileşimli sorgu yürütme (REPL) için komut satırı araçları sağlar.
EdgeDB, tablo tabanlı bir veri modeli yerine nesne türlerine dayalı bildirimsel bir sistem kullanır. Türler arasındaki ilişkiyi tanımlamak için yabancı anahtarlar yerine referansa göre bağlantı kullanılır (bir nesne başka bir nesnenin özelliği olarak kullanılabilir).
type Kişi { gerekli ad: str; } Film yazın { gerekli başlık: str; çoklu aktörler: Kişi; }
Sorgu işlemeyi hızlandırmak için dizinler kullanılabilir. Güçlü özellik yazma, özellik değeri kısıtlamaları, hesaplanan özellikler ve saklı prosedürler gibi özellikler de desteklenir. Bir şekilde ORM'yi anımsatan EdgeDB nesne depolama şemasının özellikleri arasında şemaları karıştırma yeteneği, farklı nesnelerden bağlantı özellikleri ve entegre JSON desteği yer alıyor.
Şema geçişini depolamak için yerleşik araçlar sağlanmıştır - ayrı bir esdl dosyasında belirtilen şemayı değiştirdikten sonra, sadece "edgedb migration create" komutunu çalıştırın; DBMS şemadaki farklılıkları analiz edecek ve etkileşimli olarak esdl dosyasına geçiş için bir komut dosyası oluşturacaktır. yeni şema. Şema değişikliklerinin geçmişi otomatik olarak izlenir.
Sorgu oluşturmak için hem GraphQL sorgu dili hem de hiyerarşik veriler için SQL'in uyarlanması olan özel EdgeDB dili desteklenir. Sorgu sonuçları, listeler yerine yapılandırılmış bir şekilde biçimlendirilir ve alt sorgular ve JOIN'ler yerine, bir EdgeQL sorgusunu başka bir sorgu içinde ifade olarak belirtebilirsiniz. İşlemler ve döngüler desteklenir.
seç Film { başlık, aktörler: { ad } } filtre .başlık = "The Matrix" insert Film { title := "The Matrix Resurrections", aktörler := ( seçin Kişi filtresi .name in { 'Keanu Reeves', 'Carrie- Anne Moss', 'Laurence Fishburne' } ) }
Yeni sürümde:
- Fts eklentisi aracılığıyla uygulanan tam metin arama desteği eklendi. Herhangi bir nesneyi aranabilir bir belgeye dönüştürmek için fts::index dizinini kullanmalısınız ve fts::search() işlevi, dizine alınmış belgeler arasında belirli bir ifadeyi aramak için önerilmektedir. Sonuçlar, bulunan nesneyi ve arama ağırlığını içeren demetler biçiminde döndürülür. Örneğin: Öğe türü { gerekli mevcut: bool { varsayılan := false; }; gerekli ad: str; gerekli açıklama: str; index fts::index on ( fts::with_options( .name, language := fts::Language.eng ) ); } res ile := ( select fts::search(Item, 'candy corn', language := 'eng')) ) res.object'i seçin {isim, puan := res.score} res.score desc'e göre sıralayın;
- Aralıklı aralıkları temsil etmek için bir veya daha fazla değer aralığını tanımlayan yeni bir veri türü olan "çok aralıklı" eklendi. Belirtilen aralıklardaki örtüşen alanların normalleştirilmesi otomatik olarak gerçekleştirilir. İşleme aralıkları için önceden mevcut olan tüm işlevler ve operatörler "çok aralıklı" türle çalışabilir. çoklu aralığı seçin([aralık(8, 10)]) + aralık(1, 5) — aralık(3, 4);
- HTTP üzerinden GraphQL ve EdgeQL'e erişimi kısıtlamak için varsayılan kimlik doğrulama desteği eklendi ve etkinleştirildi.
- Veritabanı örneğinden ayrı olarak çalışan bir kimlik doğrulama hizmetini başlatmak için, OAuth'u veya e-posta ve parola kullanarak oturum açmayı destekleyen "auth" uzantısı eklenmiştir.
- Karma ve şifreleme için hmac, gen_salt ve crypt işlevlerini sağlayan pgcrypto uzantısı eklendi. ext::pgcrypto::digest('bunu şifrele', 'sha1'); seçeneğini seçin
- Dize benzerliğini belirlemeye yönelik işlevlere sahip pg_trgm uzantısı eklendi.
- Performansı artırmak için optimizasyonlar yapıldı. Bellek tüketimi... sunucu %40 oranında azaltıldı. EdgeQL sorgu ayrıştırıcı kodu Rust dilinde yeniden yazıldı.
- EdgeQL, daha tanıdık bir koşullu sözdizimi için destek ekledi (if ... o zaman .. else ...). Belirtilen koşullara göre çeşitli nesneleri oluşturmak, güncellemek ve silmek için koşullu DML'yi kullanma yeteneği sağlar. to_bytes(), to_str(), enc::base64_encode ve enc::base64_decode işlevleri eklendi. Tetikleyicilerin "ne zaman" ifadelerini kullanmasına izin verilir. if count(Object) > 0'ı, ardından 'veri var'ı, aksi takdirde 'veri yok'u seçin; seç (Kullanıcı filtresini seç .name = 'Alice') ?? (Kullanıcıyı girin { name := 'Alice' }); enc::base64_encode(b'hello'); seçeneğini seçin
- Global değerleri GraphQL sorgularına aktarmanın yeni bir yolu eklendi - ayrı bir alan kullanmak yerine, __globals__ nesnesine dayalı değişkenleri aktarma yeteneği eklendi.
Kaynak: opennet.ru
