เหตุผลที่ดีในการใช้มุมมอง SQL คืออะไร?


102

ฉันกำลังอ่านพระคัมภีร์ SQL Server 2008 และฉันกำลังพูดถึงส่วนมุมมอง แต่ผู้เขียนไม่ได้อธิบายวัตถุประสงค์ของมุมมองจริงๆ ใช้ประโยชน์อะไรสำหรับมุมมอง? ฉันควรใช้พวกเขาในเว็บไซต์ของฉันและประโยชน์ของพวกเขาคืออะไร?


คุณช่วยกรุณาส่งไฟล์ฐานข้อมูลของหนังสือ "SQL Server 2008 Bible" ให้ฉันได้ไหม เว็บไซต์ของผู้เขียนตายแล้วและฉันไม่สามารถเข้าถึงเขาได้

คำตอบ:


94

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

บอกว่าคุณต้องการที่จะเกษียณอายุตาราง ( T_OLD) ที่มีข้อมูลสำหรับผู้ใช้ที่ใช้งานและแทนที่จะใช้ตารางใหม่ที่มีข้อมูลที่คล้ายกัน (ชื่อT_NEW) activeแต่อย่างหนึ่งที่มีข้อมูลสำหรับผู้ใช้ทั้งการใช้งานและไม่ได้ใช้งานกับคอลัมน์พิเศษหนึ่ง

หากระบบของคุณมีคำค้นหากว่าพันล้านรายการSELECT whatever FROM T_OLD WHERE whateverคุณมีสองทางเลือกสำหรับการเปิดตัว:

1) Cold Turkey - เปลี่ยนฐานข้อมูลและในเวลาเดียวกันเปลี่ยนทดสอบและปล่อยโค้ดจำนวนมากซึ่งมีข้อความค้นหาดังกล่าว ยากมากที่จะทำ (หรือแม้แต่ประสานงาน) มีความเสี่ยงมาก ไม่ดี

2) ค่อยเป็นค่อยไป - เปลี่ยน DB โดยการสร้างT_NEWตารางวางT_OLDตารางและแทนที่จะสร้างVIEWเรียกT_OLDว่าเลียนแบบT_OLDโต๊ะ 100% (เช่นแบบสอบถามมุมมองSELECT all_fields_except_active FROM T_NEW WHERE active=1)

วิธีนี้จะช่วยให้คุณหลีกเลี่ยงการปล่อยรหัสใด ๆ ที่เลือกจากT_OLDปัจจุบันและทำการเปลี่ยนแปลงเพื่อย้ายรหัสจากT_OLDไปยังT_NEWในเวลาว่าง

นี่เป็นตัวอย่างง่ายๆมีคนอื่น ๆ อีกมากมายที่เกี่ยวข้อง

ป.ล. ในทางกลับกันคุณน่าจะมีAPI ขั้นตอนการจัดเก็บแทนการสืบค้นโดยตรงจากT_OLDแต่นั่นก็ไม่ได้เป็นเช่นนั้นเสมอไป


3
ฉันไม่รู้คำว่า "API ขั้นตอนการจัดเก็บ" และข้อดี / ข้อเสียที่เกี่ยวข้องและพบว่าบทความนี้มีประโยชน์: codinghorror.com/blog/2005/05/…
Jeff Widman

ขออภัยฉันไปงานปาร์ตี้ช้า แต่เรื่องการแสดงล่ะ หากฉันต้องการการรวมบนตารางเดิมและฉันจะเข้าร่วม View แทนจะใช้แผนการดำเนินการที่ดีที่สุดหรือไม่
Zikato


V สิ่งบ่งชี้ที่ดี
Afnan Ahmad

47

(คัดลอกมาจากบทช่วยสอนแรกที่เกิดขึ้นในการค้นหาของ Google (ตอนนี้ลิงก์ตายแล้ว) แต่มันมีประโยชน์ทั้งหมดที่ฉันจะพิมพ์ด้วยตัวเอง)

มุมมองมีประโยชน์ดังต่อไปนี้:

  • ความปลอดภัย - ผู้ใช้สามารถเข้าถึงมุมมองได้ในขณะที่ไม่สามารถเข้าถึงตารางพื้นฐานได้โดยตรง สิ่งนี้ช่วยให้ DBA มอบเฉพาะข้อมูลที่ผู้ใช้ต้องการในขณะที่ปกป้องข้อมูลอื่น ๆ ในตารางเดียวกัน
  • ความเรียบง่าย - มุมมองสามารถใช้เพื่อซ่อนและใช้คำค้นหาที่ซับซ้อนซ้ำได้
  • การจำลองชื่อคอลัมน์หรือการชี้แจง - มุมมองสามารถใช้เพื่อระบุนามแฝงในชื่อคอลัมน์เพื่อให้น่าจดจำและ / หรือมีความหมายมากขึ้น
  • Stepping Stone - มุมมองสามารถเป็นก้าวสำคัญในข้อความค้นหา "หลายระดับ" ตัวอย่างเช่นคุณสามารถสร้างมุมมองของแบบสอบถามที่นับจำนวนการขายที่พนักงานขายแต่ละคนทำ จากนั้นคุณสามารถสอบถามข้อมูลพร็อพเพอร์ตี้นั้นเพื่อจัดกลุ่มพนักงานขายตามจำนวนการขายที่พวกเขาทำ

เนื่องจากฉันชอบคำตอบของคุณและไม่เห็นว่ามีการเพิ่มอีกประเด็นหนึ่งฉันขอแนะนำสองรายการเพิ่มเติมในรายการของคุณได้ไหม มุมมองที่จัดทำดัชนีสามารถเพิ่มประสิทธิภาพได้ การเรียกใช้การอัปเดตกับมุมมองแทนที่จะส่งตรงไปยังตารางสามารถให้ความมั่นใจได้สูงขึ้นว่าคุณจะไม่อัปเดตตารางการผลิตหลักนั้นอย่างไม่ถูกต้อง :)
David Hall

อีกหนึ่งประเด็นในรายการของคุณ DBA ส่วนใหญ่ต้องการใช้มุมมองเนื่องจากสามารถปรับมุมมองได้หนึ่งมุมมองและส่วนใหญ่ (ไม่เสมอไป) การสืบค้นทั้งหมดที่ใช้มุมมองนั้นจะได้รับการปรับแต่ง
Nitin Midha

นี่คือคำตอบ 99% ในหนังสือของฉัน
John Steedman

BTW @David ลิงค์เสีย
Manuel Jordan

ประเด็นสุดท้ายเราใช้ temp table ไม่ได้หรือ?
Jiechao Wang

16

เหตุผลบางประการจากWikipedia :

มุมมองสามารถให้ข้อได้เปรียบเหนือตาราง:

  1. มุมมองสามารถแสดงถึงส่วนย่อยของข้อมูลที่มีอยู่ในตาราง
  2. มุมมองสามารถรวมและลดความซับซ้อนของตารางหลายตารางลงในตารางเสมือนเดียว
  3. มุมมองสามารถทำหน้าที่เป็นตารางรวมโดยที่เครื่องมือฐานข้อมูลจะรวบรวมข้อมูล (ผลรวมค่าเฉลี่ย ฯลฯ ) และแสดงผลลัพธ์ที่คำนวณเป็นส่วนหนึ่งของข้อมูล
  4. ผู้ชมสามารถซ่อนความซับซ้อนของข้อมูล ; ตัวอย่างเช่นมุมมองอาจปรากฏเป็น Sales2000 หรือ Sales2001 โดยแบ่งพาร์ติชันตารางพื้นฐานจริงอย่างโปร่งใส
  5. ชมใช้พื้นที่น้อยมากในการจัดเก็บ ; ฐานข้อมูลมีเพียงคำจำกัดความของมุมมองไม่ใช่สำเนาของข้อมูลทั้งหมดที่นำเสนอ
  6. ขึ้นอยู่กับโปรแกรม SQL ที่ใช้มุมมองสามารถให้ความปลอดภัยเพิ่มเติม
  7. มุมมองสามารถจำกัด ระดับการเปิดรับแสงของโต๊ะหรือโต๊ะกับโลกภายนอกได้

14

VIEWS สามารถใช้เป็นส่วนที่ใช้ซ้ำได้ของ SELECT / CODE ซึ่งสามารถรวมไว้ใน select / queries อื่น ๆ ที่จะเข้าร่วมและใช้ตัวกรองต่างๆได้โดยไม่ต้องสร้าง SELECT ใหม่ทั้งหมดทุกครั้ง

นอกจากนี้ยังวางตรรกะไว้ในตำแหน่งเดียวเพื่อที่คุณจะได้ไม่ต้องเปลี่ยนทั้งหมดในฐานรหัส

มองไปที่

ทางเลือกระหว่างกระบวนงานที่เก็บไว้ฟังก์ชั่นมุมมองทริกเกอร์อินไลน์ SQL

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


6
ระมัดระวังในการทำเช่นนี้ หากคุณใช้มุมมองที่เรียกมุมมองอื่น ๆ คุณสามารถสร้างความยุ่งเหยิงด้านประสิทธิภาพได้มาก
HLGEM

คุณสามารถทำได้โดยการสร้างวิธีการและใส่แบบสอบถาม SQL ภายในวิธีการ วิธีนี้สามารถใช้ซ้ำได้ทุกครั้ง แล้วทำไมต้องดู ???
ASharma7

11

มุมมองเป็นเลเยอร์นามธรรมและทำสิ่งที่เลเยอร์นามธรรมที่ดีทำรวมถึงการห่อหุ้มสคีมาฐานข้อมูลและปกป้องคุณจากผลที่ตามมาของการเปลี่ยนแปลงรายละเอียดการใช้งานภายใน

มันเป็นอินเทอร์เฟซ


1
ตราบเท่าที่คุณไม่ซ้อนมุมมองในมุมมองสำหรับนามธรรมเพิ่มเติม
HLGEM

ฉันคิดว่าฉันปฏิเสธสิ่งที่เป็นนามธรรมหลายระดับได้อย่างมีประสิทธิภาพในฐานข้อมูลเชิงสัมพันธ์ และฉันไม่เรียกกระบวนงานที่จัดเก็บจากกระบวนงานที่เก็บไว้ด้วย :)
dkretz

3

นี่คือการใช้มุมมองทั่วไปอย่างหนึ่งเพื่อ จำกัด เอนทิตีด้วยเกณฑ์บางอย่าง

ตาราง: USERS ประกอบด้วยผู้ใช้ทั้งหมด

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

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


2

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


2

นี่คือสาเหตุหลายประการในการใช้มุมมองแทนที่จะใช้ตารางโดยตรง

  • ความเรียบง่าย - มุมมองสามารถใช้เพื่อซ่อนข้อความค้นหาที่ซับซ้อนได้
  • ความปลอดภัย - มุมมองสามารถซ่อนข้อมูลสำคัญบางอย่างจากผู้ใช้ปลายทางได้โดยการสร้างมุมมองในคอลัมน์ที่เลือก
  • ความปลอดภัย - รักษาความปลอดภัยตารางเพื่อเปลี่ยนโครงสร้างโดยใช้ VIEW
  • ความซ้ำซ้อน - ลดรหัสซ้ำซ้อนในทุกขั้นตอน / แบบสอบถามโดยใช้มุมมองทั่วไป
  • การคำนวณ - การคำนวณทั้งหมดสามารถทำได้เพียงครั้งเดียวในการดูแบบสอบถาม
  • ชื่อที่มีความหมาย - ตารางอาจมีชื่อสำหรับ id เช่น tbl_org_emp_id ซึ่งสามารถใช้นามแฝงเช่น [Employee No] หรือชื่อที่มีความหมาย

จากimexploring.com


1

เหตุผล / การใช้งานทั่วไปเล็กน้อย:

  • ใช้เพื่อเปลี่ยนรูปแบบหรือ 'รูปลักษณ์' ของข้อมูล (เช่นคุณอาจรวมชื่อและนามสกุลเข้าด้วยกัน)

    ทำการคำนวณหรือค้นหาข้อมูลอื่น ๆ

    ทำให้ข้อมูลผิดปกติ (ดึงข้อมูลจากหลายตารางไปยังจุดเดียว)


-6

มุมมองที่ชั่วร้าย! หลีกเลี่ยงสิ่งเหล่านี้ถ้าเป็นไปได้และใช้เฉพาะเหตุผลที่ DVK กล่าวไว้นั่นคือการย้ายข้อมูลชั่วคราว

คุณควรเข้าใจว่าในฐานข้อมูลที่มีตาราง 100 ตารางนั้นยากที่จะจำจุดประสงค์ของทุกตาราง ตอนนี้ถ้าคุณเพิ่มที่นี่อีก 300 มุมมองมันจะกลายเป็นเรื่องยุ่งโดยสิ้นเชิง กว่าที่ "คนรักการดู" มักจะใช้มุมมองที่ซ้อนกันแล้วใช้มุมมองที่ซ้อนกันในกระบวนงานที่เก็บไว้ ตอนนี้ฉันทำงานกับฐานข้อมูลที่มีมุมมองซ้อนกันในเชิงลึก 4 เท่า! ดังนั้นเพื่อให้เข้าใจตรรกะที่ง่ายที่สุดของขั้นตอนการจัดเก็บฉันต้องผ่านมุมมองทั้งหมดก่อน


8
-1 วิวดี พวกเขาสามารถกลายเป็นคนชั่วได้หากคุณใช้มันอย่างไม่เหมาะสม - แต่นั่นเป็นเรื่องจริงเกี่ยวกับอะไรก็ได้
NullUserException

1
มุมมองอาจเป็นอันตรายหากใช้ไม่ดี ผู้ที่ใช้สิ่งเหล่านี้ในทางที่ไม่ดีส่วนใหญ่มักจะเป็นผู้ที่ใช้สิ่งเหล่านี้ในสิ่งที่เป็นนามธรรมแล้วทำตามที่คุณพูดเรียกการดูที่เรียกการดูที่เรียกการดูไปยังจุดที่คุณอาจต้องสร้างข้อมูลซ้ำ 10 ล้านครั้งก่อนที่จะส่งคืนผลลัพธ์ ชุดที่ 3 การเรียกดูตารางโดยตรงจะมีประโยชน์มาก
HLGEM

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