ฉันเคยคิดว่าสคีมาเป็นออบเจ็กต์ "upper wrapper" ก่อนตัวฐานข้อมูล ฉันหมายถึงDB.schema.<what_ever_object_name_under_schema>
.
ตอนนี้แคตตาล็อก "wrapper" ค่อนข้างสับสน ทำไมเราต้องมีแคตตาล็อก? ควรใช้แคตตาล็อกอย่างแม่นยำเพื่อจุดประสงค์ใด
ฉันเคยคิดว่าสคีมาเป็นออบเจ็กต์ "upper wrapper" ก่อนตัวฐานข้อมูล ฉันหมายถึงDB.schema.<what_ever_object_name_under_schema>
.
ตอนนี้แคตตาล็อก "wrapper" ค่อนข้างสับสน ทำไมเราต้องมีแคตตาล็อก? ควรใช้แคตตาล็อกอย่างแม่นยำเพื่อจุดประสงค์ใด
คำตอบ:
จากมุมมองเชิงสัมพันธ์:
แค็ตตาล็อกคือสถานที่ที่ - เหนือสิ่งอื่นใด - สคีมาทั้งหมด (ภายนอกแนวความคิดภายใน) และการแมปที่เกี่ยวข้องทั้งหมด (ภายนอก / แนวความคิดแนวความคิด / ภายใน) จะถูกเก็บไว้
กล่าวอีกนัยหนึ่งแค็ตตาล็อกประกอบด้วยข้อมูลโดยละเอียด (บางครั้งเรียกว่าข้อมูลตัวอธิบายหรือข้อมูลเมตา ) เกี่ยวกับวัตถุต่างๆที่ระบบสนใจ
ตัวอย่างเช่นเครื่องมือเพิ่มประสิทธิภาพใช้ข้อมูลแค็ตตาล็อกเกี่ยวกับดัชนีและโครงสร้างหน่วยเก็บข้อมูลทางกายภาพอื่น ๆ รวมถึงข้อมูลอื่น ๆ เพื่อช่วยในการตัดสินใจว่าจะใช้คำขอของผู้ใช้อย่างไร ในทำนองเดียวกันระบบย่อยการรักษาความปลอดภัยจะใช้ข้อมูลแค็ตตาล็อกเกี่ยวกับผู้ใช้และข้อ จำกัด ด้านความปลอดภัยเพื่อให้หรือปฏิเสธคำขอดังกล่าวตั้งแต่แรก
Introduction to Database Systems, 7th ed., CJ Date, p 69-70.
แค็ตตาล็อกเป็นชื่อคอลเลกชันของสกีมาในสภาพแวดล้อม SQL สภาพแวดล้อม SQL ประกอบด้วยแค็ตตาล็อกศูนย์หรือมากกว่า แค็ตตาล็อกประกอบด้วยสคีมาตั้งแต่หนึ่งรายการขึ้นไป แต่จะมีสคีมาที่ชื่อ INFORMATION_SCHEMA ที่มีมุมมองและโดเมนของสคีมาข้อมูลเสมอ
ภาษาฐานข้อมูล SQL , (เสนอแก้ไขข้อความของ DIS 9075), หน้า 45
แคตตาล็อกมักจะตรงกันกับฐานข้อมูล ใน SQL dbms ส่วนใหญ่หากคุณสอบถามมุมมอง information_schema คุณจะพบค่านั้นในคอลัมน์ "table_catalog" แมปกับชื่อของฐานข้อมูล
หากคุณพบว่าแพลตฟอร์มของคุณใช้แค็ตตาล็อกในลักษณะที่กว้างกว่าคำจำกัดความใด ๆ ในสามข้อนี้อาจหมายถึงสิ่งที่กว้างกว่าฐานข้อมูล - คลัสเตอร์ฐานข้อมูลเซิร์ฟเวอร์หรือคลัสเตอร์เซิร์ฟเวอร์ แต่ฉันสงสัยว่าเนื่องจากคุณพบสิ่งนั้นอย่างง่ายดายในเอกสารของแพลตฟอร์มของคุณ
ไมค์แชร์ริลล์ 'แมวเรียกคืน'ให้คำตอบที่ดี ฉันจะเพิ่มเพียงตัวอย่างหนึ่ง: Postgres
เมื่อคุณติดตั้ง Postgres บนเครื่องที่ติดตั้งที่เรียกว่าคลัสเตอร์ 'คลัสเตอร์' ในที่นี้ไม่ได้หมายถึงฮาร์ดแวร์ของคอมพิวเตอร์หลายเครื่องที่ทำงานร่วมกัน ใน Postgres คลัสเตอร์หมายถึงความจริงที่ว่าคุณสามารถมีฐานข้อมูลที่ไม่เกี่ยวข้องกันได้หลายฐานข้อมูลโดยใช้เอ็นจิ้นเซิร์ฟเวอร์ Postgres เดียวกัน
คลัสเตอร์คำยังถูกกำหนดโดยSQL Standardในลักษณะเดียวกับใน Postgres การปฏิบัติตามมาตรฐาน SQL อย่างใกล้ชิดเป็นเป้าหมายหลักของโครงการ Postgres
ข้อกำหนดSQL-92กล่าวว่า:
คลัสเตอร์คือคอลเล็กชันแค็ตตาล็อกที่กำหนดโดยการนำไปใช้งาน
และ
คลัสเตอร์เดียวที่เชื่อมโยงกับเซสชัน SQL
นั่นเป็นวิธีที่ป้านในการบอกว่าคลัสเตอร์เป็นเซิร์ฟเวอร์ฐานข้อมูล (แต่ละแค็ตตาล็อกคือฐานข้อมูล)
ดังนั้นทั้งใน Postgres และ SQL Standard เราจึงมีลำดับชั้นการกักกันนี้:
แผนภาพนี้แสดงถึงคลัสเตอร์เดียว ในกรณีของ 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.ledger
sales.accounting.ledger
ยังไงซะ…
คุณอาจได้ยินคำว่าschema ที่ใช้ในความหมายทั่วไปหมายถึงการออกแบบโครงสร้างตารางของฐานข้อมูลทั้งหมด ในทางตรงกันข้ามใน SQL Standard คำว่าหมายถึงเลเยอร์เฉพาะในCluster > Catalog > Schema > Table
ลำดับชั้นโดยเฉพาะ
Postgres ใช้ทั้งฐานข้อมูลคำและแค็ตตาล็อกในที่ต่างๆเช่นคำสั่งCREATE DATABASE
ไม่ใช่ระบบฐานข้อมูลทั้งหมดที่มีลำดับชั้นแบบเต็มCluster > Catalog > Schema > Table
นี้ บางรายการมีเพียงแค็ตตาล็อกเดียว (ฐานข้อมูล) บางส่วนไม่มีสคีมามีตารางเพียงชุดเดียว Postgres เป็นผลิตภัณฑ์ที่มีประสิทธิภาพสูง
PostgreSQL (pg_catalog)
แคตตาล็อกระบบหลายสิบ "pg_" ตารางที่เก็บข้อมูลเมตาคำจำกัดความของฐานข้อมูลของคุณเช่นpg_index
, และpg_trigger
pg_constraint
(2) ANSI (information_schema)
มุมมองแบบอ่านอย่างเดียวของแค็ตตาล็อกระบบเดียวกันที่กำหนดโดยมาตรฐาน SQL เป็น information_schema
. ชื่อที่ดีกว่าสำหรับโหนด "แคตตาล็อก" ใน pgAdmin อาจเป็น "System" หรือ "System Tables"
...Catalog > Schema...
เช่นนั้นมีใครช่วยบอกฉันได้ไหมว่าทำไมโหนด "Catalog" และ "Schema" ใน pgAdmin (PostgreSQL UI) เป็นโหนดพี่น้องแทนที่จะเป็นโหนด Schema เป็นโหนดลูกของ Catalog