อะไรคือความแตกต่างระหว่างแค็ตตาล็อกและสคีมาในฐานข้อมูลเชิงสัมพันธ์?


99

ฉันเคยคิดว่าสคีมาเป็นออบเจ็กต์ "upper wrapper" ก่อนตัวฐานข้อมูล ฉันหมายถึงDB.schema.<what_ever_object_name_under_schema>.

ตอนนี้แคตตาล็อก "wrapper" ค่อนข้างสับสน ทำไมเราต้องมีแคตตาล็อก? ควรใช้แคตตาล็อกอย่างแม่นยำเพื่อจุดประสงค์ใด

คำตอบ:


75

จากมุมมองเชิงสัมพันธ์:

แค็ตตาล็อกคือสถานที่ที่ - เหนือสิ่งอื่นใด - สคีมาทั้งหมด (ภายนอกแนวความคิดภายใน) และการแมปที่เกี่ยวข้องทั้งหมด (ภายนอก / แนวความคิดแนวความคิด / ภายใน) จะถูกเก็บไว้

กล่าวอีกนัยหนึ่งแค็ตตาล็อกประกอบด้วยข้อมูลโดยละเอียด (บางครั้งเรียกว่าข้อมูลตัวอธิบายหรือข้อมูลเมตา ) เกี่ยวกับวัตถุต่างๆที่ระบบสนใจ

ตัวอย่างเช่นเครื่องมือเพิ่มประสิทธิภาพใช้ข้อมูลแค็ตตาล็อกเกี่ยวกับดัชนีและโครงสร้างหน่วยเก็บข้อมูลทางกายภาพอื่น ๆ รวมถึงข้อมูลอื่น ๆ เพื่อช่วยในการตัดสินใจว่าจะใช้คำขอของผู้ใช้อย่างไร ในทำนองเดียวกันระบบย่อยการรักษาความปลอดภัยจะใช้ข้อมูลแค็ตตาล็อกเกี่ยวกับผู้ใช้และข้อ จำกัด ด้านความปลอดภัยเพื่อให้หรือปฏิเสธคำขอดังกล่าวตั้งแต่แรก

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


จากมุมมองมาตรฐาน SQL:

แค็ตตาล็อกเป็นชื่อคอลเลกชันของสกีมาในสภาพแวดล้อม SQL สภาพแวดล้อม SQL ประกอบด้วยแค็ตตาล็อกศูนย์หรือมากกว่า แค็ตตาล็อกประกอบด้วยสคีมาตั้งแต่หนึ่งรายการขึ้นไป แต่จะมีสคีมาที่ชื่อ INFORMATION_SCHEMA ที่มีมุมมองและโดเมนของสคีมาข้อมูลเสมอ

ภาษาฐานข้อมูล SQL , (เสนอแก้ไขข้อความของ DIS 9075), หน้า 45


จากมุมมอง SQL:

แคตตาล็อกมักจะตรงกันกับฐานข้อมูล ใน SQL dbms ส่วนใหญ่หากคุณสอบถามมุมมอง information_schema คุณจะพบค่านั้นในคอลัมน์ "table_catalog" แมปกับชื่อของฐานข้อมูล

หากคุณพบว่าแพลตฟอร์มของคุณใช้แค็ตตาล็อกในลักษณะที่กว้างกว่าคำจำกัดความใด ๆ ในสามข้อนี้อาจหมายถึงสิ่งที่กว้างกว่าฐานข้อมูล - คลัสเตอร์ฐานข้อมูลเซิร์ฟเวอร์หรือคลัสเตอร์เซิร์ฟเวอร์ แต่ฉันสงสัยว่าเนื่องจากคุณพบสิ่งนั้นอย่างง่ายดายในเอกสารของแพลตฟอร์มของคุณ


186

ไมค์แชร์ริลล์ 'แมวเรียกคืน'ให้คำตอบที่ดี ฉันจะเพิ่มเพียงตัวอย่างหนึ่ง: Postgres

คลัสเตอร์ = การติดตั้ง Postgres

เมื่อคุณติดตั้ง Postgres บนเครื่องที่ติดตั้งที่เรียกว่าคลัสเตอร์ 'คลัสเตอร์' ในที่นี้ไม่ได้หมายถึงฮาร์ดแวร์ของคอมพิวเตอร์หลายเครื่องที่ทำงานร่วมกัน ใน Postgres คลัสเตอร์หมายถึงความจริงที่ว่าคุณสามารถมีฐานข้อมูลที่ไม่เกี่ยวข้องกันได้หลายฐานข้อมูลโดยใช้เอ็นจิ้นเซิร์ฟเวอร์ Postgres เดียวกัน

คลัสเตอร์คำยังถูกกำหนดโดยSQL Standardในลักษณะเดียวกับใน Postgres การปฏิบัติตามมาตรฐาน SQL อย่างใกล้ชิดเป็นเป้าหมายหลักของโครงการ Postgres

ข้อกำหนดSQL-92กล่าวว่า:

คลัสเตอร์คือคอลเล็กชันแค็ตตาล็อกที่กำหนดโดยการนำไปใช้งาน

และ

คลัสเตอร์เดียวที่เชื่อมโยงกับเซสชัน SQL

นั่นเป็นวิธีที่ป้านในการบอกว่าคลัสเตอร์เป็นเซิร์ฟเวอร์ฐานข้อมูล (แต่ละแค็ตตาล็อกคือฐานข้อมูล)

คลัสเตอร์> แค็ตตาล็อก> สคีมา> ตาราง> คอลัมน์และแถว

ดังนั้นทั้งใน Postgres และ SQL Standard เราจึงมีลำดับชั้นการกักกันนี้:

  • คอมพิวเตอร์อาจมีคลัสเตอร์เดียวหรือหลาย ๆ
  • เซิร์ฟเวอร์ฐานข้อมูลเป็นคลัสเตอร์
  • กลุ่มมีแคตตาล็อก (แค็ตตาล็อก = ฐานข้อมูล)
  • แคตตาล็อกมีสกีมา (Schema = เนมสเปซของตารางและขอบเขตความปลอดภัย)
  • schemas มีตาราง
  • ตารางมีแถว
  • แถวมีค่าที่กำหนดโดยคอลัมน์
    ค่าเหล่านี้คือข้อมูลทางธุรกิจที่แอปของคุณและผู้ใช้สนใจเช่นชื่อบุคคลวันที่ครบกำหนดใบแจ้งหนี้ราคาผลิตภัณฑ์คะแนนสูงสุดของเกมเมอร์ คอลัมน์กำหนดชนิดข้อมูลของค่า (ข้อความวันที่ตัวเลขและอื่น ๆ )

แผนภาพแสดงกล่องซ้อนที่แสดงวิธีการเชื่อมต่อบนพอร์ตทำให้คุณเข้าสู่คลัสเตอร์ (เซิร์ฟเวอร์ฐานข้อมูล) ซึ่งมีแค็ตตาล็อก (ฐานข้อมูล) อย่างน้อยหนึ่งรายการซึ่งแต่ละรายการมี Schemas (เนมสเปซ) อย่างน้อยหนึ่งตารางซึ่งแต่ละตารางมี แถว

หลายคลัสเตอร์

แผนภาพนี้แสดงถึงคลัสเตอร์เดียว ในกรณีของ Postgres คุณสามารถมีได้มากกว่าหนึ่งคลัสเตอร์ต่อคอมพิวเตอร์โฮสต์ (หรือระบบปฏิบัติการเสมือน) โดยทั่วไปจะมีการทำคลัสเตอร์หลายกลุ่มสำหรับการทดสอบและปรับใช้ Postgres เวอร์ชันใหม่ (เช่น9.0 , 9.1 , 9.2 , 9.3 , 9.4 , 9.5 )

หากคุณมีหลายคลัสเตอร์ให้จินตนาการถึงแผนภาพด้านบนที่ซ้ำกัน

หมายเลขพอร์ตที่แตกต่างกันทำให้หลายคลัสเตอร์สามารถทำงานร่วมกันได้พร้อมกันทั้งหมด แต่ละคลัสเตอร์จะถูกกำหนดหมายเลขพอร์ตของตนเอง ปกติ5432เป็นเพียงค่าเริ่มต้นและคุณสามารถตั้งค่าได้ แต่ละคลัสเตอร์กำลังฟังพอร์ตที่กำหนดเองสำหรับการเชื่อมต่อฐานข้อมูลขาเข้า

สถานการณ์ตัวอย่าง

ตัวอย่างเช่น บริษัท อาจมีทีมพัฒนาซอฟต์แวร์สองทีมที่แตกต่างกัน หนึ่งเขียนซอฟต์แวร์เพื่อจัดการคลังสินค้าในขณะที่อีกทีมสร้างซอฟต์แวร์เพื่อจัดการการขายและการตลาด ทีมนักพัฒนาแต่ละคนมีฐานข้อมูลของตัวเองโดยไม่รู้ตัวของอีกฝ่ายอย่างมีความสุข

แต่ทีมปฏิบัติการไอทีได้ตัดสินใจเรียกใช้ฐานข้อมูลทั้งสองบนกล่องคอมพิวเตอร์เครื่องเดียว (Linux, Mac, อะไรก็ได้) ในกล่องนั้นพวกเขาติดตั้ง Postgres เซิร์ฟเวอร์ฐานข้อมูลเดียว (คลัสเตอร์ฐานข้อมูล) ในคลัสเตอร์นั้นพวกเขาสร้างแคตตาล็อกสองรายการแค็ตตาล็อกสำหรับทีมนักพัฒนาแต่ละทีมหนึ่งชื่อ 'คลังสินค้า' และอีกหนึ่งชื่อ 'การขาย'

ทีมนักพัฒนาแต่ละทีมใช้ตารางหลายสิบตารางโดยมีวัตถุประสงค์และบทบาทการเข้าถึงที่แตกต่างกัน ดังนั้นทีมนักพัฒนาแต่ละทีมจึงจัดตารางของตนเป็นสคีมา โดยบังเอิญทีม dev ทั้งสองทำการติดตามข้อมูลทางบัญชีดังนั้นแต่ละทีมจึงมีสคีมาที่ชื่อว่า 'การบัญชี' การใช้ชื่อสคีมาเดียวกันไม่ใช่ปัญหาเนื่องจากแต่ละแค็ตตาล็อกมีเนมสเปซของตัวเองจึงไม่เกิดความขัดแย้งกัน

นอกจากนี้ในที่สุดแต่ละทีมจะสร้างตารางสำหรับวัตถุประสงค์ทางการบัญชีชื่อ 'บัญชีแยกประเภท' อีกครั้งไม่มีความขัดแย้งในการตั้งชื่อ

คุณสามารถคิดว่าตัวอย่างนี้เป็นลำดับชั้น ...

  • คอมพิวเตอร์ (กล่องฮาร์ดแวร์หรือเซิร์ฟเวอร์เสมือน)
    • Postgres 9.2 คลัสเตอร์ (การติดตั้ง)
      • warehouse แคตตาล็อก (ฐานข้อมูล)
        • inventory สคีมา
          • […บางโต๊ะ]
        • accounting สคีมา
          • ledger ตาราง
          • […โต๊ะอื่น ๆ ]
      • sales แคตตาล็อก (ฐานข้อมูล)
        • selling สคีมา
          • […บางโต๊ะ]
        • accounting สคีมา (ชื่อเดียวกันกับด้านบนโดยบังเอิญ)
          • ledger ตาราง (ชื่อเดียวกันกับด้านบนโดยบังเอิญ)
          • […โต๊ะอื่น ๆ ]
    • Postgres 9.3 คลัสเตอร์
      • […สคีมาและตารางอื่น ๆ ]

ซอฟต์แวร์ของทีมนักพัฒนาแต่ละคนเชื่อมต่อกับคลัสเตอร์ เมื่อทำเช่นนั้นพวกเขาต้องระบุว่าแค็ตตาล็อก (ฐานข้อมูล) ใดเป็นของพวกเขา Postgres ต้องการให้คุณเชื่อมต่อกับหนึ่งแค็ตตาล็อก แต่คุณไม่ จำกัด เฉพาะแค็ตตาล็อกนั้น แค็ตตาล็อกเริ่มต้นนั้นเป็นเพียงค่าเริ่มต้นซึ่งใช้เมื่อคำสั่ง SQL ของคุณละเว้นชื่อของแค็ตตาล็อก

ดังนั้นหากทีม dev จำเป็นต้องเข้าถึงตารางของทีมอื่นพวกเขาอาจทำได้หากผู้ดูแลระบบฐานข้อมูลให้สิทธิ์แก่พวกเขาในการทำเช่นนั้น การเข้าถึงถูกทำด้วยการตั้งชื่ออย่างชัดเจนในรูปแบบ: catalog.schema.table ดังนั้นถ้า 'คลังสินค้า' ทีมต้องการที่จะเห็นทีมอื่น ๆ ( 'ขาย' ทีม) บัญชีแยกประเภทที่พวกเขาเขียนคำสั่ง SQL sales.accounting.ledgerกับ accounting.ledgerในการเข้าถึงบัญชีแยกประเภทของตัวเองของพวกเขาเพียงเขียน หากพวกเขาเข้าถึงบัญชีแยกประเภททั้งในชิ้นเดียวกันของรหัสที่มาที่พวกเขาอาจเลือกที่จะหลีกเลี่ยงความสับสนโดยรวมทั้งของตัวเอง (ถ้ามี) ชื่อแคตตาล็อกของพวกเขาเมื่อเทียบกับwarehouse.accounting.ledgersales.accounting.ledger


ยังไงซะ…

คุณอาจได้ยินคำว่าschema ที่ใช้ในความหมายทั่วไปหมายถึงการออกแบบโครงสร้างตารางของฐานข้อมูลทั้งหมด ในทางตรงกันข้ามใน SQL Standard คำว่าหมายถึงเลเยอร์เฉพาะในCluster > Catalog > Schema > Tableลำดับชั้นโดยเฉพาะ

Postgres ใช้ทั้งฐานข้อมูลคำและแค็ตตาล็อกในที่ต่างๆเช่นคำสั่งCREATE DATABASE

ไม่ใช่ระบบฐานข้อมูลทั้งหมดที่มีลำดับชั้นแบบเต็มCluster > Catalog > Schema > Tableนี้ บางรายการมีเพียงแค็ตตาล็อกเดียว (ฐานข้อมูล) บางส่วนไม่มีสคีมามีตารางเพียงชุดเดียว Postgres เป็นผลิตภัณฑ์ที่มีประสิทธิภาพสูง


8
ถ้าเป็น...Catalog > Schema...เช่นนั้นมีใครช่วยบอกฉันได้ไหมว่าทำไมโหนด "Catalog" และ "Schema" ใน pgAdmin (PostgreSQL UI) เป็นโหนดพี่น้องแทนที่จะเป็นโหนด Schema เป็นโหนดลูกของ Catalog
The Red Pea

6
โหนด "Schema" นั้นเป็นของคุณ แต่โหนด "Catalogs" ไม่ใช่ "การแคตตาล็อก" โหนดมีตรงสองรายการ (1) PostgreSQL (pg_catalog)แคตตาล็อกระบบหลายสิบ "pg_" ตารางที่เก็บข้อมูลเมตาคำจำกัดความของฐานข้อมูลของคุณเช่นpg_index, และpg_trigger pg_constraint(2) ANSI (information_schema)มุมมองแบบอ่านอย่างเดียวของแค็ตตาล็อกระบบเดียวกันที่กำหนดโดยมาตรฐาน SQL เป็น information_schema. ชื่อที่ดีกว่าสำหรับโหนด "แคตตาล็อก" ใน pgAdmin อาจเป็น "System" หรือ "System Tables"
Basil Bourque

ขอบคุณ. "ไม่ใช่ระบบฐานข้อมูลทั้งหมดจะมีลำดับชั้นทั้งหมดของ Cluster> Catalog> Schema> Table" ฉันสงสัยว่า mysql และ SQL Server เป็นอย่างไร
ทิม

+1. ตารางทั้งหมดในสคีมามีสคีมาเชิงสัมพันธ์เหมือนกันหรือไม่ (เช่นชุดของแอตทริบิวต์เดียวกันและ / หรือชุดข้อ จำกัด เดียวกัน) คุณช่วยดูคำถามของฉันstackoverflow.com/questions/48232448/…ได้ไหม ขอบคุณ.
ทิม

1
@Tim สคีมาเป็นเพียงเนมสเปซที่แยกกลุ่มของตารางเช่นโฟลเดอร์เป็นเนมสเปซที่จัดระเบียบไฟล์ในระบบไฟล์ (ยกเว้นไม่มีการซ้อนสคีมา) ตารางจัดเก็บข้อมูลแอปของคุณเป็นแอตทริบิวต์ / คอลัมน์ตามแถว
Basil Bourque
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.