SQL Server schema ที่ดีคืออะไร


185

ฉันไม่เริ่มใช้ฐานข้อมูล SQL และโดยเฉพาะ SQL Server อย่างไรก็ตามฉันเคยเป็นคน SQL 2000 เป็นหลักและฉันมักจะสับสนโดย schemas ในปี 2005+ ใช่ฉันรู้คำจำกัดความพื้นฐานของสคีมา แต่สิ่งที่พวกเขาใช้สำหรับการปรับใช้ SQL Server ทั่วไป

ฉันมักจะใช้สคีมาเริ่มต้นเสมอ เหตุใดฉันจึงต้องการสร้างสกีมาเฉพาะ เหตุใดฉันจึงต้องกำหนดสกีมาใด ๆ ในตัว

แก้ไข: เพื่อชี้แจงฉันเดาว่าฉันกำลังมองหาประโยชน์ของสคีมา หากคุณกำลังจะใช้มันเป็นระบบความปลอดภัยดูเหมือนว่าบทบาทฐานข้อมูลจะได้รับการเติมเต็มแล้ว .. เอ่อ .. เอ่อ .. บทบาท และการใช้มันเป็นตัวระบุเนมสเปซดูเหมือนจะเป็นสิ่งที่คุณสามารถทำได้ด้วยความเป็นเจ้าของ (dbo กับผู้ใช้ ฯลฯ )

ฉันเดาว่าฉันกำลังทำอะไรอยู่ Schemas ทำอะไรคุณไม่สามารถทำอะไรกับเจ้าของและบทบาทได้บ้าง? สิ่งที่เป็นประโยชน์ของพวกเขาคืออะไร?

คำตอบ:


164

Schemas ตารางกลุ่มตรรกะขั้นตอนการดูด้วยกัน วัตถุที่เกี่ยวข้องกับพนักงานทั้งหมดในemployeeสคีมา ฯลฯ

คุณยังสามารถให้สิทธิ์กับสคีมาเพียงหนึ่งเดียวเพื่อให้ผู้ใช้สามารถเห็นสคีมาที่พวกเขาสามารถเข้าถึงได้และไม่มีอะไรอื่นอีก


21
ความเป็นไปได้ในการกำหนดสิทธิ์ให้กับสคีมาทำให้คุ้มค่าจากมุมมองการบริหาร
Hakan Winther

9
คุณไม่สามารถใช้ฐานข้อมูลแยกต่างหากได้หรือ
sam yi

7
สคีมาที่ได้รับอนุญาตนี้ฟังดูดีบนกระดาษ ... แต่ไม่ค่อยได้ใช้อย่างถูกต้อง สำหรับฉันแล้วมันไม่คุ้มค่ากับปัญหา
sam yi

3
แต่ถ้าเป็นเช่นนั้นคุณไม่สามารถทำสิ่งเดียวกันได้โดยใช้หลักการตั้งชื่อใช่ไหม ฉันไม่ได้บอกว่าไม่มีกรณีใช้ มันบ่อยกว่าไม่ได้นอกจากนี้โดยการลบ
sam yi

6
@ Ajedi32 ใช่แล้ว ... ด้วยสคีมาคุณสามารถรับปรมาณูเดี่ยวในบันทึกธุรกรรมเดียวและสำรองข้อมูลทั้งหมดของคุณได้ในนัดเดียวกับฐานข้อมูลสองฐานที่ไม่ซิงค์และต่อสู้กับธุรกรรมแบบกระจาย
Matthew Whited

31

เช่นเดียวกับ Namespace ของรหัส C #


16
น่าเสียดายที่เนมสเปซของ schemas และ. NET นั้นเล่นได้ไม่ดีนักจากมุมมอง ORM ( Entity Framework ) ตารางในMyDatabase.MySchemaสคีมาไม่ได้แม็พกับคลาสเอนทิตีในMyProject.MyDatabase.MySchemaเนมสเปซอย่างน่าอัศจรรย์ นอกจากนี้ยังเป็นที่น่าสังเกตว่าจุดใด ๆ ที่มีเครื่องหมายจุด ( .) แฮ็คในชื่อตารางจะลงท้ายด้วยเครื่องหมายขีดล่าง ( _) ในชื่อคลาส เพียงแค่อาหารสำหรับความคิดที่โชคร้าย
Dan Lugg

2
การเปรียบเทียบที่ดีสำหรับการสอน ฉันไม่เห็นว่าจะต้องดำเนินการอย่างแท้จริง 100% ... (คำพูดเหล่านั้นฟังดูน้อยในทางปฏิบัติ)
Samantha Branham

6
โดยส่วนตัวแล้วฉันหวังว่าพวกเขาจะเป็นเหมือนเนมสเปซ. NET มากขึ้นเรื่อย ๆ ซึ่งมันสามารถซ้อนทับจำนวนสกีมาได้ตามที่คุณต้องการ และฉันหวังว่าพวกเขาจะทำแผนที่ให้ดีขึ้นใน EF
Dan Lugg

พวกเขาไม่เหมือนกับเนมสเปซในภาษาใด ๆ ที่ฉันนึกได้
Tanveer Badar

29

พวกเขายังสามารถให้การป้องกันการชนกันของข้อมูลปลั๊กอินได้ด้วย ตัวอย่างเช่นคุณลักษณะ Change Data Capture ใหม่ใน SQL Server 2008 จะวางตารางที่ใช้ใน cdc schema แยกต่างหาก ด้วยวิธีนี้พวกเขาไม่ต้องกังวลเกี่ยวกับความขัดแย้งของการตั้งชื่อระหว่างตาราง CDC และตารางจริงที่ใช้ในฐานข้อมูลและสำหรับเรื่องนั้นสามารถเงาชื่อของตารางจริงโดยเจตนา


17

ฉันรู้ว่ามันเป็นเธรดเก่า แต่ฉันเพิ่งตรวจสอบสกีมาด้วยตัวเองและคิดว่าสิ่งต่อไปนี้อาจเป็นตัวเลือกที่ดีสำหรับการใช้สคีมา:

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


9

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

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

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


8

ฉันมักจะเห็นด้วยกับเบรนต์ในเรื่องนี้ ... ดูการสนทนานี้ที่นี่ http://www.brentozar.com/archive/2010/05/why-use-schemas/

ในระยะสั้น ... schemas ไม่ได้มีประโยชน์มากยกเว้นกรณีการใช้งานที่เฉพาะเจาะจงมาก ทำให้สิ่งต่าง ๆ ยุ่ง อย่าใช้มันหากคุณสามารถช่วยได้ และพยายามเชื่อฟังกฎ K (eep) I (t) S (imple) S (tupid) กฎ


2
ฉันไม่คิดว่า Brent กำลังโต้เถียงว่า "schemas is bad" เพียงแค่การใช้ schema ที่ไม่ใช่ค่าเริ่มต้นนั้นซับซ้อนกว่าการใช้ schema ที่เป็นค่าเริ่มต้น ส่วนที่เหลือของผลรวมของคุณถูกต้อง
โจเซฟไดเกิล

"ถ้าใช้ [สกีมา] ถูกต้องพวกเขาจะให้คุณแยกการอนุญาตตามกลุ่มของวัตถุ" ~ brentozar.com/archive/2010/05/why-use-schemas
LL Learner

7

ฉันไม่เห็นประโยชน์ในการใช้ชื่อแทนผู้ใช้ที่เชื่อมโยงกับ Schemas นี่คือเหตุผลที่ ....

คนส่วนใหญ่เชื่อมต่อบัญชีผู้ใช้ของพวกเขากับฐานข้อมูลผ่านบทบาทในขั้นต้นทันทีที่คุณกำหนดผู้ใช้ให้กับดูแลระบบหรือบทบาทฐานข้อมูล db_owner ในรูปแบบใด ๆ บัญชีนั้นจะเป็นนามแฝงกับบัญชีผู้ใช้ "dbo" หรือเต็ม การอนุญาตในฐานข้อมูล ทันทีที่เกิดขึ้นไม่ว่าคุณจะกำหนดตัวเองให้อยู่ในสคีมานอกเหนือจากสกีมาเริ่มต้นของคุณ (ซึ่งมีชื่อเดียวกับบัญชีผู้ใช้ของคุณ) สิทธิ์ dbo เหล่านั้นจะถูกกำหนดให้กับวัตถุเหล่านั้นที่คุณสร้างภายใต้ผู้ใช้และสคีมา มันไม่มีจุดหมายเลย ..... และเป็นเพียง namespace และสร้างความสับสนให้กับการเป็นเจ้าของที่แท้จริงในวัตถุเหล่านั้น มันเป็นการออกแบบที่แย่ถ้าคุณถามฉัน .... ใครก็ตามที่ออกแบบมัน

สิ่งที่พวกเขาควรทำคือสร้าง "กลุ่ม" และโยนสคีมาและบทบาทและเพียงแค่อนุญาตให้คุณจัดกลุ่มกลุ่มของกลุ่มในชุดค่าผสมใด ๆ ที่คุณต้องการจากนั้นแต่ละระดับจะบอกระบบว่าสิทธิ์ถูกสืบทอดปฏิเสธหรือเขียนทับด้วยตนเอง คน สิ่งนี้จะเป็นเรื่องที่เข้าใจได้ง่ายกว่าและอนุญาตให้ DBA ควบคุมได้ดีกว่าว่าใครเป็นเจ้าของจริงบนวัตถุเหล่านั้น ในขณะนี้โดยนัยแล้วในกรณีส่วนใหญ่ผู้ใช้ SQL Server ดีฟอลต์ dbo มีสิทธิ์เหล่านั้น .... ไม่ใช่ผู้ใช้


7

ที่ร้าน ORACLE ที่ฉันทำงานมาหลายปี schema นั้นถูกใช้เพื่อสรุปขั้นตอน (และแพ็คเกจ) ที่ใช้กับแอปพลิเคชั่นส่วนหน้าต่างๆ สคีมา 'API' ที่แตกต่างกันสำหรับแต่ละแอปพลิเคชันมักจะสมเหตุสมผลเนื่องจากกรณีการใช้งานผู้ใช้และความต้องการของระบบนั้นแตกต่างกันมาก ตัวอย่างเช่นหนึ่ง 'API' schema สำหรับการพัฒนา / การกำหนดค่าแอปพลิเคชันเท่านั้นที่จะใช้โดยนักพัฒนา สคีมา 'API' อีกอันหนึ่งสำหรับการเข้าถึงข้อมูลลูกค้าผ่านมุมมองและขั้นตอน (การค้นหา) สคีมา 'API' อีกหนึ่งห่อหุ้มรหัสที่ใช้สำหรับการซิงโครไนซ์การพัฒนา / การกำหนดค่าและข้อมูลไคลเอ็นต์กับแอปพลิเคชันที่มีฐานข้อมูลของตัวเอง schemas 'API' เหล่านี้บางส่วนภายใต้หน้าปกจะยังคงแชร์โพรซีเดอร์และฟังก์ชันทั่วไปกับ eachother (ผ่าน 'สามัญ' อื่น ๆ

ฉันจะบอกว่าการไม่มีสคีมาอาจไม่ใช่จุดจบของโลกแม้ว่ามันจะมีประโยชน์มาก จริงๆแล้วมันคือการขาดแพคเกจใน SQL Server ที่สร้างปัญหาในใจของฉัน ... แต่นั่นคือหัวข้อที่แตกต่างกัน


ด้วย Oracle เนื่องจาก 1 อินสแตนซ์ = 1 ฐานข้อมูล = 1 สิทธิ์การใช้งานในการชำระเงินผู้ใช้ shemas เพื่อหลีกเลี่ยงการสร้างฐานข้อมูลอื่นและชำระค่าใบอนุญาตอื่น ใน SQl Server เซิร์ฟเวอร์ 1 ตัวสามารถจัดการฐานข้อมูลได้มากมาย
Patrick Honorez

5

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

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

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


3

ใน SQL Server 2000 วัตถุที่สร้างถูกเชื่อมโยงกับผู้ใช้นั้นเช่นถ้าผู้ใช้บอกว่า Sam สร้างวัตถุพูดพนักงานตารางนั้นจะปรากฏขึ้นเช่น: Sam.Employees ถ้าแซมออกจาก compnay หรือย้ายไปที่ธุรกิจอื่น ทันทีที่คุณลบผู้ใช้แซมสิ่งที่จะเกิดขึ้นกับตาราง Sam.Employees อาจคุณต้องเปลี่ยนความเป็นเจ้าของก่อนจาก Sam.Employees เป็น dbo.Employess สคีมานำเสนอวิธีการแก้ไขปัญหานี้ Sam สามารถสร้างวัตถุทั้งหมดของเขาภายใน schemam เช่น Emp_Schema ตอนนี้ถ้าเขาสร้างวัตถุพนักงานภายใน Emp_Schema แล้ววัตถุจะถูกเรียกว่า Emp_Schema.Employees แม้ว่าบัญชีผู้ใช้ Sam จะต้องถูกลบ แต่เค้าจะไม่ได้รับผลกระทบ


1
สิ่งนี้ไม่เป็นความจริงอีกต่อไปเนื่องจากมีสองเวอร์ชันใหม่ตั้งแต่ปี 2000
โฮแกน

0

การพัฒนา - นักพัฒนาของเราแต่ละคนได้รับสคีมาของตัวเองเพื่อใช้เป็น Sandbox


29
-1 จะดีกว่าถ้าให้ devs แยกทั้งชุดของฐานข้อมูลเพื่อเล่นกับเครื่องของตนเอง มิฉะนั้นพวกเขาสามารถเปลี่ยนสิ่งที่อยู่ในสคีมาของพวกเขาได้อย่างปลอดภัยเท่านั้น มันมีความซับซ้อนในการส่งเสริมการมีชีวิตอยู่และยังทำให้การแยกสคีมาซับซ้อนด้วยเหตุผลอื่นที่อธิบายโดยคำตอบอื่น ๆ
Stephen Turner

5
ฉันไม่สามารถพูดถึงแอปพลิเคชันที่คุณกำลังทำงาน ... แต่การพัฒนาของคุณควรสะท้อนการผลิตให้มากที่สุด มี schemas ใน dev และไม่ใช่ prod อาจเป็นปัญหาได้
sam yi

0

นี่เป็นตัวอย่างการใช้งานที่ดีของการใช้สกีมากับ SQL Server เรามีแอพพลิเคชั่น ms-access หลายอัน เราต้องการแปลงไฟล์เหล่านั้นเป็นพอร์ทัลแอพ ASP.NET แอปพลิเคชัน ms-access ทุกตัวจะถูกเขียนเป็นแอพสำหรับพอร์ทัลนั้น แอปพลิเคชัน ms-access ทุกตัวมีตารางฐานข้อมูลของตัวเอง บางส่วนเกี่ยวข้องกันเราใส่สิ่งเหล่านั้นลงใน schema dbo ทั่วไปของ SQL Server ส่วนที่เหลือได้รับ schema ของตัวเอง ด้วยวิธีนี้หากเราต้องการทราบว่าตารางใดที่เป็นของแอพในพอร์ทัลแอพ ASP.NET ที่สามารถนำทางสำรวจและดูแลรักษาได้ง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.