Aracılığıyla paylaş


PostgreSQL için Azure Cosmos DB'de çok kiracılı SaaS uygulamalarını modelleme

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Cosmos DB (PostgreSQL'e citus veritabanı uzantısıyla desteklenir)

Parça anahtarı olarak Kiracı Kimliği

Kiracı kimliği, iş yükünün kökündeki sütun veya veri modelinizdeki hiyerarşinin üst kısmıdır. Örneğin, bu SaaS e-ticaret şemasında mağaza kimliği olacaktır:

store_id sütununun vurgulandığı tablo diyagramı.

Bu veri modeli Shopify gibi bir işletme için tipik olacaktır. Her mağazanın kendi verileriyle etkileşime geçtiği birden çok çevrimiçi mağazanın sitelerini barındırıyor.

  • Bu veri modelinin bir dizi tablosu vardır: mağazalar, ürünler, siparişler, satır öğeleri ve ülkeler.
  • Stores tablosu hiyerarşinin en üstünde yer alır. Ürünlerin, siparişlerin ve satır öğelerinin tümü depolarla ilişkilendirilir, bu nedenle hiyerarşide daha düşüktür.
  • Ülkeler tablosu tek tek mağazalarla ilgili değildir, mağazalar arasında yer alır.

Bu örnekte, store_idhiyerarşinin en üstünde yer alan , kiracının tanımlayıcısıdır. Doğru parça anahtarı. Parça anahtarı olarak seçmek store_id , tek bir çalışanda tek bir depo için tüm tablolarda verilerin birlikte yerleştirilmesini sağlar.

Tabloları mağazaya göre birlikte konumlandırmanın avantajları vardır:

  • Yabancı anahtarlar, JOIN'ler gibi SQL kapsamı sağlar. Tek bir kiracının işlemleri, her kiracının bulunduğu tek bir çalışan düğümünde yerelleştirilir.
  • Tek basamaklı milisaniyelik performans elde eder. Tek bir kiracının sorguları paralel hale getirmek yerine tek bir düğüme yönlendirilir ve bu da ağ atlamalarını iyileştirmeye ve işlem/belleği ölçeklendirmeye yardımcı olur.
  • Ölçeklendirilir. Kiracı sayısı arttıkça, düğüm ekleyebilir ve kiracıları yeni düğümlere yeniden dengeleyebilir, hatta büyük kiracıları kendi düğümleriyle yalıtabilirsiniz. Kiracı yalıtımı, ayrılmış kaynaklar sağlamanıza olanak tanır.

Aynı düğümlere birlikte bulunan tabloların diyagramı.

Çok kiracılı uygulamalar için en uygun veri modeli

Bu örnekte, depoya özgü tabloları mağaza kimliğine göre dağıtmalı ve bir başvuru tablosu oluşturmalıyız countries .

daha evrensel store_id vurgulanmış tablo diyagramı.

Kiracıya özgü tabloların kiracı kimliğine sahip olduğuna ve dağıtıldığına dikkat edin. Örneğimizde mağazalar, ürünler ve line_items dağıtılır. Tabloların geri kalanı başvuru tablolarıdır. Örneğimizde ülkeler tablosu bir başvuru tablosudur.

-- Distribute large tables by the tenant ID

SELECT create_distributed_table('stores', 'store_id');
SELECT create_distributed_table('products', 'store_id', colocate_with => 'stores');
-- etc for the rest of the tenant tables...

-- Then, make "countries" a reference table, with a synchronized copy of the
-- table maintained on every worker node

SELECT create_reference_table('countries');

Büyük tabloların tümü kiracı kimliğine sahip olmalıdır.

  • Mevcut çok kiracılı bir uygulamayı PostgreSQL için Azure Cosmos DB'ye geçiriyorsanız, biraz normalleştirme yapmanız ve eksikse kiracı kimliği sütununu büyük tablolara eklemeniz ve sonra da sütunun eksik değerlerini doldurmanız gerekebilir.
  • PostgreSQL için Azure Cosmos DB'de yeni uygulamalar için kiracı kimliğinin kiracıya özgü tüm tablolarda bulunduğundan emin olun.

Dağıtılmış tablolarda birincil, benzersiz ve yabancı anahtar kısıtlamalarına bileşik anahtar biçiminde kiracı kimliğini eklediğinizden emin olun. Örneğin, bir tablonun birincil anahtarı idvarsa, bunu bileşik anahtara (tenant_id,id)dönüştürün. Başvuru tablolarının anahtarlarını değiştirmeniz gerekmez.

En iyi performans için sorgu konuları

Kiracı kimliğine göre filtrelenen dağıtılmış sorgular, çok kiracılı uygulamalarda en verimli şekilde çalışır. Sorgularınızın kapsamının her zaman tek bir kiracı olarak belirlenmiş olduğundan emin olun.

SELECT *
  FROM orders
 WHERE order_id = 123
   AND store_id = 42;  -- ← tenant ID filter

Özgün filtre koşulları istediğiniz satırları kesin olarak tanımlasa bile kiracı kimliği filtresinin eklenmesi gerekir. Kiracı kimliği filtresi, yedekli gibi görünse de PostgreSQL için Azure Cosmos DB'ye sorguyu tek bir çalışan düğümüne nasıl yönlendireceklerini bildirir.

Benzer şekilde, iki dağıtılmış tabloyu birleştirirken, her iki tablonun da kapsamının tek bir kiracı olarak ayarlandığından emin olun. Kapsam belirleme, birleştirme koşullarının kiracı kimliğini içerdiğinden emin olunarak yapılabilir.

SELECT sum(l.quantity)
  FROM line_items l
 INNER JOIN products p
    ON l.product_id = p.product_id
   AND l.store_id = p.store_id   -- ← tenant ID in join
 WHERE p.name='Awesome Wool Pants'
   AND l.store_id='8c69aa0d-3f13-4440-86ca-443566c1fc75';
       -- ↑ tenant ID filter

Sorgulara kiracı kimliği eklemeyi kolaylaştıran çeşitli popüler uygulama çerçeveleri için yardımcı kitaplıklar vardır. Yönergeler şunlardır:

Sonraki adımlar

Şimdi ölçeklenebilir uygulamalar için veri modellemeyi incelemeyi tamamladık. Sonraki adım, veritabanını seçtiğiniz programlama diliyle bağlamak ve sorgulamaktır.