Apa perbedaan antara katalog dan skema dalam database relasional?

96

Saya dulu berpikir skema adalah objek "pembungkus atas" sebelum database itu sendiri. Maksudku DB.schema.<what_ever_object_name_under_schema>.

Nah, katalog "pembungkus" sekarang cukup membingungkan. Mengapa kita membutuhkan katalog? Untuk tujuan apa tepatnya katalog itu harus digunakan?

Stephan
sumber

Jawaban:

73

Dari sudut pandang relasional:

Katalog adalah tempat - antara lain - semua skema (eksternal, konseptual, internal) dan semua pemetaan yang sesuai (eksternal / konseptual, konseptual / internal) disimpan.

Dengan kata lain, katalog berisi informasi mendetail (terkadang disebut informasi deskriptor atau metadata ) mengenai berbagai objek yang menarik bagi sistem itu sendiri.

Misalnya, pengoptimal menggunakan informasi katalog tentang indeks dan struktur penyimpanan fisik lainnya, serta banyak informasi lainnya, untuk membantunya memutuskan cara mengimplementasikan permintaan pengguna. Demikian pula, subsistem keamanan menggunakan informasi katalog tentang pengguna dan batasan keamanan untuk mengabulkan atau menolak permintaan tersebut sejak awal.

An Introduction to Database Systems, 7th ed., CJ Date, hal 69-70.


Dari sudut pandang standar SQL:

Katalog diberi nama kumpulan skema di lingkungan SQL. Lingkungan SQL berisi nol atau lebih katalog. Katalog berisi satu atau lebih skema, tetapi selalu berisi skema bernama INFORMATION_SCHEMA yang berisi tampilan dan domain dari skema informasi.

Bahasa Database SQL , (Usulan revisi teks dari DIS 9075), hal 45


Dari sudut pandang SQL:

Katalog seringkali identik dengan database . Di sebagian besar dbms SQL, jika Anda mengkueri tampilan information_schema, Anda akan menemukan nilai itu di kolom "table_catalog" yang dipetakan ke nama database.

Jika Anda menemukan platform Anda menggunakan katalog dengan cara yang lebih luas daripada ketiga definisi ini, itu mungkin mengacu pada sesuatu yang lebih luas dari database - cluster database, server, atau cluster server. Tapi saya agak ragu, karena Anda akan menemukannya dengan mudah di dokumentasi platform Anda.

Mike Sherrill 'Cat Recall'
sumber
178

Mike Sherrill 'Cat Recall' memberikan jawaban yang sangat bagus . Saya akan menambahkan satu contoh: Postgres .

Cluster = Instalasi Postgres

Saat Anda menginstal Postgres di komputer, penginstalan itu disebut cluster . 'Cluster' di sini tidak dimaksudkan dalam pengertian perangkat keras dari beberapa komputer yang bekerja bersama. Di Postgres, cluster mengacu pada fakta bahwa Anda dapat memiliki beberapa database yang tidak terkait semuanya dan berjalan menggunakan mesin server Postgres yang sama.

Cluster kata juga didefinisikan oleh SQL Standard dengan cara yang sama seperti di Postgres. Mengikuti Standar SQL adalah tujuan utama dari proyek Postgres.

Spesifikasi SQL-92 mengatakan:

Sebuah cluster adalah kumpulan katalog yang ditentukan oleh implementasi.

dan

Tepat satu cluster yang terkait dengan sesi SQL

Itu cara tumpul untuk mengatakan cluster adalah server database (setiap katalog adalah database).

Cluster> Katalog> Skema> Tabel> Kolom & Baris

Jadi di Postgres dan Standar SQL kami memiliki hierarki penahanan ini:

  • Komputer mungkin memiliki satu cluster atau beberapa.
  • Server database adalah cluster .
  • Sebuah cluster memiliki katalog . (Katalog = Database)
  • Katalog memiliki skema . (Skema = namespace tabel, dan batas keamanan)
  • Skema memiliki tabel .
  • Tabel memiliki baris .
  • Baris memiliki nilai , ditentukan oleh kolom .
    Nilai-nilai tersebut adalah data bisnis yang penting bagi aplikasi dan pengguna Anda seperti nama orang, tanggal jatuh tempo faktur, harga produk, skor tinggi pemain. Kolom menentukan tipe data dari nilai (teks, tanggal, angka, dan sebagainya).

Diagram menunjukkan kotak bersarang yang menunjukkan bagaimana menghubungkan pada port membawa Anda ke cluster (server database) yang berisi satu atau lebih Katalog (database) yang masing-masing berisi satu atau lebih Skema (namespace) yang masing-masing berisi tabel yang masing-masing memiliki baris.

Beberapa Cluster

Diagram ini mewakili satu cluster. Dalam kasus Postgres, Anda dapat memiliki lebih dari satu cluster per komputer host (atau OS virtual). Beberapa cluster biasanya dilakukan, untuk menguji dan menerapkan versi baru Postgres (mis .: 9.0 , 9.1 , 9.2 , 9.3 , 9.4 , 9.5 ).

Jika Anda memang memiliki beberapa cluster, bayangkan diagram di atas digandakan.

Nomor port yang berbeda memungkinkan beberapa cluster untuk hidup berdampingan semuanya dan berjalan pada waktu yang sama. Setiap cluster akan diberi nomor portnya sendiri. Biasanya 5432hanya default, dan dapat diatur oleh Anda. Setiap cluster mendengarkan pada port yang ditetapkan sendiri untuk koneksi database yang masuk.

Contoh Skenario

Misalnya, sebuah perusahaan dapat memiliki dua tim pengembangan perangkat lunak yang berbeda. Satu orang menulis perangkat lunak untuk mengelola gudang sementara tim lainnya membuat perangkat lunak untuk mengelola penjualan dan pemasaran. Setiap tim pengembang memiliki database mereka sendiri, tanpa menyadari yang lain.

Tetapi tim operasi TI mengambil keputusan untuk menjalankan kedua database di satu kotak komputer (Linux, Mac, apa pun). Jadi di kotak itu mereka memasang Postgres. Jadi satu database server (database cluster). Dalam cluster tersebut, mereka membuat dua katalog, satu katalog untuk setiap tim pengembang: satu bernama 'gudang' dan satu bernama 'penjualan'.

Setiap tim pengembang menggunakan banyak tabel dengan tujuan dan peran akses berbeda. Jadi setiap tim pengembang mengatur tabel mereka ke dalam skema. Secara kebetulan, kedua tim pengembang melakukan pelacakan data akuntansi, sehingga setiap tim memiliki skema bernama 'akuntansi'. Menggunakan nama skema yang sama tidak menjadi masalah karena katalog masing-masing memiliki namespace sendiri sehingga tidak ada benturan.

Selanjutnya, masing-masing tim akhirnya membuat tabel untuk keperluan akuntansi bernama 'ledger'. Sekali lagi, tidak ada tabrakan penamaan.

Anda dapat menganggap contoh ini sebagai hierarki…

  • Komputer (kotak perangkat keras atau server virtual)
    • Postgres 9.2 cluster (instalasi)
      • warehouse katalog (database)
        • inventory skema
          • [… Beberapa tabel]
        • accounting skema
          • ledger meja
          • [… Beberapa tabel lainnya]
      • sales katalog (database)
        • selling skema
          • [… Beberapa tabel]
        • accounting skema (kebetulan nama yang sama seperti di atas)
          • ledger tabel (nama yang sama kebetulan seperti di atas)
          • [… Beberapa tabel lainnya]
    • Postgres 9.3 gugus
      • [… Skema & tabel lain]

Setiap perangkat lunak tim pengembang membuat koneksi ke kluster. Saat melakukannya, mereka harus menentukan katalog (database) mana yang menjadi milik mereka. Postgres mengharuskan Anda terhubung ke satu katalog, tetapi Anda tidak terbatas pada katalog itu. Katalog awal tersebut hanyalah default, digunakan saat pernyataan SQL Anda menghilangkan nama katalog.

Jadi jika tim pengembang perlu mengakses tabel tim lain, mereka dapat melakukannya jika administrator database telah memberi mereka hak istimewa untuk melakukannya. Akses dibuat dengan penamaan eksplisit dalam pola: catalog.schema.table . Jadi jika tim 'gudang' perlu melihat buku besar tim lain (tim 'penjualan'), mereka menulis pernyataan SQL dengan sales.accounting.ledger. Untuk mengakses buku besar mereka sendiri, mereka hanya menulis accounting.ledger. Jika mereka mengakses kedua buku besar dalam bagian kode sumber yang sama, mereka dapat memilih untuk menghindari kebingungan dengan memasukkan nama katalog (opsional) mereka sendiri, warehouse.accounting.ledgerversus sales.accounting.ledger.


Ngomong-ngomong…

Anda mungkin mendengar kata skema yang digunakan dalam pengertian yang lebih umum, yang berarti keseluruhan desain struktur tabel database tertentu. Sebaliknya, dalam Standar SQL, kata tersebut secara khusus berarti lapisan tertentu dalam Cluster > Catalog > Schema > Tablehierarki.

Postgres menggunakan database kata dan juga katalog di berbagai tempat seperti perintah CREATE DATABASE .

Tidak semua sistem database menyediakan hierarki penuh ini Cluster > Catalog > Schema > Table. Beberapa hanya memiliki satu katalog (database). Beberapa tidak memiliki skema, hanya satu set tabel. Postgres adalah produk yang sangat kuat.

Basil Bourque
sumber
8
Jika ya ...Catalog > Schema..., dapatkah seseorang memberi tahu saya mengapa node "Katalog" dan "Skema" di pgAdmin (PostgreSQL UI) adalah node saudara, bukan node Skema sebagai node turunan Katalog?
The Red Pea
6
Node "Skema" itu milik Anda, tetapi simpul "Katalog" bukan. The "Katalog" node memiliki tepat dua item: (1) PostgreSQL (pg_catalog), sistem katalog, puluhan meja "pg_" yang menyimpan definisi metadata dari database Anda, seperti pg_index, pg_trigger, dan pg_constraint. (2) ANSI (information_schema), tampilan hanya-baca dari katalog sistem yang sama yang ditentukan oleh standar SQL sebagai information_schema. Nama yang lebih baik untuk node "Katalog" di pgAdmin mungkin adalah "Sistem" atau "Tabel Sistem".
Basil Bourque
Terima kasih. "Tidak semua sistem database menyediakan hierarki penuh Cluster> Katalog> Skema> Tabel." Saya ingin tahu seperti apa mysql, dan SQL Server?
Tim
+1. Apakah semua tabel dalam skema memiliki skema relasional yang sama (yaitu, kumpulan atribut yang sama, dan / atau kumpulan batasan yang sama)? Bisakah Anda juga melihat pertanyaan saya stackoverflow.com/questions/48232448/… ? Terima kasih.
Tim
1
@Tim Skema hanyalah ruang nama yang memisahkan grup tabel, seperti folder adalah ruang nama yang mengatur file dalam sistem file (kecuali tidak ada skema bersarang). Tabel menyimpan data aplikasi Anda sebagai atribut / kolom demi baris.
Basil Bourque