İlişkisel bir veritabanında katalog ve şema arasındaki fark nedir?


99

Şemanın veritabanından önce "üst sarmalayıcı" nesne olduğunu düşünürdüm. Yani DB.schema.<what_ever_object_name_under_schema>.

Pekala, "ambalaj" kataloğu şimdi oldukça kafa karıştırıcı. Neden bir kataloğa ihtiyacımız var? Katalog tam olarak hangi amaçla kullanılmalıdır?

Yanıtlar:


75

İlişkisel bakış açısından:

Katalog, - diğer şeylerin yanı sıra - tüm çeşitli şemaların (dış, kavramsal, iç) ve ilgili tüm eşlemelerin (dış / kavramsal, kavramsal / iç) tutulduğu yerdir.

Diğer bir deyişle, katalog , sistemin kendisinin ilgisini çeken çeşitli nesnelerle ilgili ayrıntılı bilgiler (bazen tanımlayıcı bilgi veya meta veriler olarak adlandırılır ) içerir.

Örneğin, optimize edici, kullanıcı isteklerini nasıl uygulayacağına karar vermesine yardımcı olmak için dizinler ve diğer fiziksel depolama yapıları hakkındaki katalog bilgilerini ve diğer pek çok bilgiyi kullanır. Benzer şekilde, güvenlik alt sistemi kullanıcılar hakkındaki katalog bilgilerini ve güvenlik kısıtlamalarını ilk etapta bu tür istekleri kabul etmek veya reddetmek için kullanır.

Veritabanı Sistemlerine Giriş, 7. baskı, CJ Tarihi, s 69-70.


SQL standart bakış açısından:

Kataloglar, bir SQL ortamında adlandırılmış şema koleksiyonlarıdır. Bir SQL ortamı sıfır veya daha fazla katalog içerir. Bir katalog bir veya daha fazla şema içerir, ancak her zaman Bilgi Şemasının görünümlerini ve etki alanlarını içeren INFORMATION_SCHEMA adlı bir şema içerir.

Veritabanı Dili SQL , (DIS 9075 için önerilen gözden geçirilmiş metin), s 45


SQL bakış açısından:

Bir katalog genellikle veritabanı ile eş anlamlıdır . Çoğu SQL veritabanında, bilgi_seması görünümlerini sorgularsanız, bu değerleri veritabanının adıyla "tablo_ kataloğu" sütun eşlemesinde bulacaksınız.

Eğer kullanarak platformu bulursanız katalog veritabanı küme, bir sunucu veya sunucu kümesi - Bu üç tanımların herhangi daha geniş bir şekilde, bir veritabanı daha geniş bir şeye atıfta olabilir. Ancak bundan şüpheliyim, çünkü bunu platformunuzun belgelerinde kolayca bulabilirdiniz.


184

Mike Sherrill 'Cat Recall' mükemmel bir cevap verdi . Sadece bir örnek ekleyeceğim: Postgres .

Küme = Postgres Kurulumu

Postgres'i bir makineye kurduğunuzda, bu kuruluma küme adı verilir . Buradaki "küme" , birden fazla bilgisayarın birlikte çalıştığı donanım anlamında kastedilmemektedir . Postgres'te küme , aynı Postgres sunucu motorunu kullanarak tümüyle çalışır durumda olan birden fazla ilgisiz veritabanına sahip olabileceğiniz gerçeğini ifade eder.

Kelime kümesi de Postgres ile aynı şekilde SQL Standardı tarafından tanımlanır . SQL Standardını yakından takip etmek, Postgres projesinin birincil hedefidir.

SQL-92 şartname diyor ki:

Küme, uygulama tanımlı bir katalog koleksiyonudur.

ve

Tam olarak bir küme bir SQL oturumuyla ilişkilidir

Bu, bir kümenin bir veritabanı sunucusu olduğunu söylemenin geniş bir yolu (her katalog bir veritabanıdır).

Küme> Katalog> Şema> Tablo> Sütunlar ve Satırlar

Dolayısıyla hem Postgres hem de SQL Standardında şu kapsama hiyerarşisine sahibiz:

  • Bir bilgisayarın bir veya birden çok kümesi olabilir.
  • Bir veritabanı sunucusu bir kümedir .
  • Bir kümenin katalogları vardır . (Katalog = Veritabanı)
  • Katalogların şemaları vardır . (Şema = tabloların ad alanı ve güvenlik sınırı)
  • Şemaların tabloları vardır .
  • Tabloların satırları vardır .
  • Satırların sütunlarla tanımlanan değerleri vardır . Bu değerler, uygulamalarınızın ve kullanıcıların ilgilendiği kişi adı, fatura son ödeme tarihi, ürün fiyatı, oyuncunun yüksek puanı gibi iş verileridir. Sütun , değerlerin veri türünü (metin, tarih, sayı vb.) Tanımlar .

Bir bağlantı noktasına bağlanmanın sizi, her biri bir veya daha fazla Şema (bir ad alanı) içeren bir veya daha fazla Katalog (bir veritabanı) içeren kümeye (veritabanı sunucusu) nasıl götürdüğünü gösteren iç içe yerleştirme kutularını gösteren şema satırlar.

Çoklu Küme

Bu şema tek bir kümeyi temsil etmektedir. Postgres durumunda, ana bilgisayar (veya sanal işletim sistemi) başına birden fazla kümeye sahip olabilirsiniz. Postgres'in yeni sürümlerini test etmek ve dağıtmak için genellikle birden çok küme yapılır (ör. 9.0 , 9.1 , 9.2 , 9.3 , 9.4 , 9.5 ).

Birden fazla kümeniz varsa, yukarıdaki diyagramın kopyalandığını hayal edin.

Farklı bağlantı noktası numaraları, birden fazla kümenin aynı anda yan yana ve çalışır durumda yaşamasına izin verir. Her kümeye kendi bağlantı noktası numarası atanacaktır. Her zamanki 5432yalnızca varsayılandır ve sizin tarafınızdan ayarlanabilir. Her küme, gelen veritabanı bağlantıları için kendi atanmış bağlantı noktasını dinliyor.

Örnek Senaryo

Örneğin, bir şirketin iki farklı yazılım geliştirme ekibi olabilir. Biri depoları yönetmek için yazılım yazarken, diğer ekip satış ve pazarlamayı yönetmek için yazılım geliştiriyor. Her geliştirme ekibinin, diğerlerinin farkında olmadan kendi veritabanı vardır.

Ancak BT operasyonları ekibi, her iki veritabanını da tek bir bilgisayar kutusunda (Linux, Mac, her neyse) çalıştırmaya karar verdi. Yani o kutuya Postgres kurdular. Yani bir veritabanı sunucusu (veritabanı kümesi). Bu kümede, her geliştirme ekibi için bir katalog olmak üzere iki katalog oluştururlar: biri 'depo' ve diğeri 'satış' adlı.

Her geliştirme ekibi, farklı amaçlara ve erişim rollerine sahip çok sayıda tablo kullanır. Böylece her geliştirici ekip, tablolarını şemalar halinde düzenler. Tesadüfen, her iki geliştirme ekibi de muhasebe verilerinin bir miktar takibini yapar, böylece her takımın 'muhasebe' adlı bir şeması olur. Aynı şema adını kullanmak bir sorun değildir, çünkü katalogların her birinin kendi ad alanı vardır, dolayısıyla çakışma olmaz.

Ayrıca, her takım sonunda muhasebe amaçları için 'defter' adlı bir tablo oluşturur. Yine, isim çakışması yok.

Bu örneği bir hiyerarşi olarak düşünebilirsiniz ...

  • Bilgisayar (donanım kutusu veya sanallaştırılmış sunucu)
    • Postgres 9.2 küme (kurulum)
      • warehouse katalog (veritabanı)
        • inventory şema
          • [… Bazı tablolar]
        • accounting şema
          • ledger masa
          • [… Diğer bazı tablolar]
      • sales katalog (veritabanı)
        • selling şema
          • [… Bazı tablolar]
        • accounting şema (yukarıdakiyle tesadüfen aynı ad)
          • ledger tablo (tesadüfen yukarıdaki ile aynı isim)
          • [… Diğer bazı tablolar]
    • Postgres 9.3 küme
      • [… Diğer şemalar ve tablolar]

Her geliştirme ekibinin yazılımı kümeye bağlantı kurar. Bunu yaparken, hangi kataloğun (veritabanı) kendilerine ait olduğunu belirtmeleri gerekir. Postgres, bir kataloğa bağlanmanızı gerektirir, ancak bu katalogla sınırlı değilsiniz. Bu ilk katalog yalnızca bir varsayılandır ve SQL ifadeleriniz bir kataloğun adını atladığında kullanılır.

Dolayısıyla, geliştirici ekibin diğer ekibin tablolarına erişmesi gerekirse , veritabanı yöneticisi onlara bunu yapma yetkisi verdiyse bunu yapabilir. Erişim, desende açık adlandırma ile yapılır: catalog.schema.table . Dolayısıyla, 'depo' ekibinin diğer takımın ('satış' ekibi) defterini görmesi gerekiyorsa, SQL ifadelerini ile yazarlar sales.accounting.ledger. Kendi defterlerine erişmek için sadece yazarlar accounting.ledger. Onlar kaynak kodunun aynı parça hem defterleri erişmek, bunlar, kendi (opsiyonel) katalog adını ekleyerek karışıklığı önlemek seçebilir warehouse.accounting.ledgerkarşı sales.accounting.ledger.


Bu arada…

Daha genel anlamda, yani belirli bir veritabanının tablo yapısının tüm tasarımında kullanılan şema kelimesini duyabilirsiniz . Buna karşılık, SQL Standardında kelime özellikle Cluster > Catalog > Schema > Tablehiyerarşideki belirli katman anlamına gelir .

Postgres , CREATE DATABASE komutu gibi çeşitli yerlerde hem kelime veritabanını hem de kataloğu kullanır .

Tüm veritabanı sistemleri bu tam hiyerarşiyi sağlamaz Cluster > Catalog > Schema > Table. Bazılarının yalnızca tek bir kataloğu (veritabanı) vardır. Bazılarının şeması yoktur, sadece bir tablo grubu vardır. Postgres, olağanüstü güçlü bir üründür.


8
Eğer öyleyse ...Catalog > Schema..., birisi bana pgAdmin'deki (PostgreSQL UI) "Katalog" ve "Şema" düğümlerinin, Catalog'un alt düğümü olarak Schema düğümü yerine neden kardeş düğümler olduğunu söyleyebilir mi?
Kırmızı Bezelye

6
Bu "Şema" düğümü sizindir, ancak "Kataloglar" düğümü değildir. "Kataloglar" düğüm tam iki öğe vardır: (1) PostgreSQL (pg_catalog), Sistem kataloğu gibi veritabanlarınızın meta tanımlarını saklamak "pg_" tabloları, onlarca pg_index, pg_triggerve pg_constraint. (2) ANSI (information_schema), SQL standardı tarafından tanımlanan aynı sistem kataloğunun salt okunur görünümü information_schema. PgAdmin'deki "Kataloglar" düğümü için daha iyi bir ad "Sistem" veya "Sistem Tabloları" olabilir.
Basil Bourque

Teşekkürler. "Tüm veritabanı sistemleri bu tam Küme> Katalog> Şema> Tablo hiyerarşisini sağlamaz." Mysql ve SQL Server için nasıl bir şey olduğunu merak ediyorum.
Tim

+1. Bir şemadaki tüm tablolar aynı ilişkisel şemaya mı (yani, aynı özniteliklere ve / veya aynı kısıtlamalara) sahip mi? Stackoverflow.com/questions/48232448/… sorumu da görebilir misiniz ? Teşekkürler.
Tim

1
@Tim Bir şema, tablo gruplarını ayıran bir ad alanıdır ; klasörler, dosyaları bir dosya sisteminde düzenleyen bir ad alanıdır (şemaların iç içe geçmemesi hariç). Tablolar, uygulamanızın verilerini satırlara göre özellikler / sütunlar olarak depolar.
Basil Bourque
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.