มุมมองที่ดีสำหรับอะไร?


88

ฉันแค่พยายามทำความเข้าใจทั่วไปว่ามุมมองใดที่ใช้สำหรับ RDBMSes กล่าวคือฉันรู้ว่ามุมมองคืออะไรและจะสร้างได้อย่างไร ฉันยังรู้ว่าที่ผ่านมาฉันใช้มันเพื่ออะไร

แต่ฉันต้องการให้แน่ใจว่าฉันมีความเข้าใจอย่างถ่องแท้ว่ามุมมองใดมีประโยชน์และมุมมองใดที่ไม่ควรมีประโยชน์ โดยเฉพาะอย่างยิ่ง:

  1. มุมมองมีประโยชน์สำหรับอะไร?
  2. มีสถานการณ์ใดบ้างที่ดึงดูดให้ใช้มุมมองเมื่อคุณไม่ควรใช้มุมมอง?
  3. เหตุใดคุณจึงใช้มุมมองแทนสิ่งต่างๆเช่นฟังก์ชันมูลค่าตารางหรือในทางกลับกัน
  4. มีสถานการณ์ใดบ้างที่มุมมองอาจมีประโยชน์ซึ่งไม่ปรากฏให้เห็นในตอนแรกหรือไม่?

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


1
คล้ายกับคำถามที่โพสต์ไว้ที่นี่: stackoverflow.com/questions/1278521/…
MedicineMan

ฉันรู้สึกว่าstackoverflow.com/questions/1278521/…ให้คำตอบที่ดีกว่าสำหรับคำถามนี้
GinTonic

คำตอบ:


43

1) มุมมองมีประโยชน์สำหรับอะไร?

IOPOในที่เดียวเท่านั้น

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

•มุมมองยังมีเลเยอร์นามธรรมที่ป้องกันการเข้าถึงตารางโดยตรง (และการใส่กุญแจมือที่อ้างอิงถึงการอ้างอิงทางกายภาพ) อันที่จริงฉันคิดว่าเป็นแนวทางปฏิบัติที่ดี1ในการนำเสนอเฉพาะการเข้าถึงข้อมูลพื้นฐานของคุณที่เป็นนามธรรม (โดยใช้มุมมองและฟังก์ชันที่มีมูลค่าตาราง) รวมถึงมุมมองเช่น1ฉัน hafta ยอมรับว่ามี "ทำตามที่ฉันพูดไม่ใช่ฉัน ทำ "ในคำแนะนำนั้น;)

CREATE VIEW AS
      SELECT * FROM tblData


2) มีสถานการณ์ใดบ้างที่ดึงดูดให้ใช้มุมมองเมื่อคุณไม่ควรใช้มุมมอง?

ประสิทธิภาพในมุมมองรวมเคยเป็นปัญหา (เช่น SQL 2000) ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันไม่ได้กังวลเกี่ยวกับเรื่องนี้มาระยะหนึ่งแล้ว (ฉันคิดไม่ออกว่าตอนนี้ฉันใช้การรวมมุมมองอยู่ที่ไหน)

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

    •ดูคำอธิบายตารางที่ได้รับใน http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) เหตุใดคุณจึงใช้มุมมองแทนสิ่งต่างๆเช่นฟังก์ชันมูลค่าตารางหรือในทางกลับกัน

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

4) มีสถานการณ์ใดบ้างที่มุมมองอาจเป็นประโยชน์ซึ่งไม่ปรากฏในครั้งแรก

ฉันไม่สามารถนึกถึงการใช้ส่วนบนของศีรษะที่ไม่ชัดเจนได้ (ฉันคิดว่าถ้าฉันทำได้มันจะทำให้พวกเขาชัดเจน;)

9
ฉันไม่เห็นด้วยว่ามันสมเหตุสมผลที่จะสร้างมุมมองบนตารางเมื่อมันเป็น SELECT * FROM tblData คุณช่วยให้คำอธิบายได้ไหมว่าเหตุใดจึงเป็นประโยชน์
ผู้ลงทะเบียน

IOPO - ในที่เดียวเท่านั้น - วลีนี้เป็นที่รู้จักกันดีหรือไม่? ดูเหมือนฉันจะไม่พบข้อมูลอ้างอิงมากมาย? มันมีรูปแบบอื่น ๆ เช่น DRY หรือไม่?
Robert

1
@ โรเบิร์ตใช่แห้งการทำให้เป็นมาตรฐาน IOPO สิ่งเหล่านี้ล้วนเป็นรสชาติที่แตกต่างกันของปรัชญาเดียวกัน
TylerH

45

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

การดูเป็นวิธีที่ดีในการนำเสนอสิ่งง่ายๆในการรายงานนักเขียน หากผู้ใช้ทางธุรกิจของคุณต้องการเข้าถึงข้อมูลจากบางสิ่งเช่น Crystal Reports คุณสามารถให้มุมมองบางอย่างในบัญชีของพวกเขาเพื่อลดความซับซ้อนของข้อมูล - อาจทำให้ข้อมูลนั้นผิดปกติ


21

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


19

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


-1 "การดูทำให้เป็นปกติ"? ขออภัยนั่นเป็นเรื่องไร้สาระเว้นแต่ว่าจะมีคุณสมบัติเหมาะสม
แค่ใครสักคน

19
พวกเขาทำให้ผิดปกติอย่างแน่นอน หากคุณมีตารางที่เกี่ยวข้องซึ่งปรับให้เป็นมาตรฐานเป็นรูปแบบที่ 3 และคุณสร้างมุมมองเพื่อ "แบน" ความสัมพันธ์นั้นจะไม่ทำให้เกิดการทำให้เป็นมาตรฐานได้อย่างไร
Kilhoffer

11

นอกเหนือจากสิ่งที่ผู้อื่นระบุไว้แล้วมุมมองยังมีประโยชน์ในการลบคิวรี SQL ที่รวบรวมเพิ่มเติมออกจากแอปพลิเคชัน

ตัวอย่างเช่นแทนที่จะทำในแอปพลิเคชัน:

sql = "เลือก a, b จาก table1 union เลือก a, b จาก table2";

คุณสามารถสรุปสิ่งนั้นเป็นมุมมอง:

สร้างมุมมอง union_table1_table2_v เป็น
เลือก a, b จาก
ยูเนี่ยนtable1
เลือก a, b จาก table2

และในรหัสแอปมีเพียง:

sql = "เลือก a, b จาก union_table1_table2_v";

นอกจากนี้หากโครงสร้างข้อมูลเปลี่ยนไปคุณจะไม่ต้องเปลี่ยนรหัสแอพคอมไพล์ใหม่และปรับใช้ใหม่ คุณแค่เปลี่ยนมุมมองในฐานข้อมูล


เหตุใดฉันจึงต้องการเขียน sql ที่ซับซ้อนในฐานข้อมูลแทนที่จะเป็นแอป
Ivan Virabyan

3
ยิ่งข้อความค้นหาของคุณซับซ้อนมากขึ้นโอกาสที่จะเปลี่ยนแปลงในอนาคตก็จะยิ่งมากขึ้นส่วนหนึ่งเป็นผลมาจากการกดปุ่มตารางมากขึ้น เมื่อโครงสร้างฐานข้อมูลเปลี่ยนไปคุณจะต้องเปลี่ยนรหัสของคุณด้วยและทำการรีลีส หากความซับซ้อนนั้นเป็นนามธรรมในมุมมอง DBA อาจสามารถทำการเปลี่ยนแปลงโครงสร้างในตาราง underling ได้โดยที่โค้ดของคุณไม่ต้องเปลี่ยน
CodingWithSpike

11

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


6

OP ถามว่ามีสถานการณ์ที่อาจดึงดูดให้ใช้มุมมองหรือไม่ แต่ก็ไม่เหมาะสม

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

ตัวอย่างเช่นสมมติว่าคุณต้องรวมตาราง A, B, C และ D เข้าด้วยกัน คุณอาจถูกล่อลวงให้มองจากตาราง A & B และมุมมองจาก C & D จากนั้นจึงรวมสองมุมมองเข้าด้วยกัน การรวม A, B, C และ D ในแบบสอบถามเดียวจะดีกว่ามาก


ฉันไม่คิดว่าถูกต้องอย่างน้อยนั่นก็ไม่ใช่วิธีที่ทฤษฎี DBMS ดำเนินไป (การนำไปใช้งานต่างๆอาจตัดสินใจที่จะไม่ให้เกียรติทฤษฎี) ตัวแยกวิเคราะห์แบบสอบถามจะแทนที่มุมมองที่เห็นด้วย sql ที่เกี่ยวข้องเป็นหลักและเครื่องมือเพิ่มประสิทธิภาพจะไปจากที่นั่น 2 กรณีควรเทียบเท่ากัน
SquareCog

นอกจากนี้ยังไม่ถือเป็นจริงเมื่อคุณสามารถเพิ่มดัชนีในมุมมองของคุณ
therealhoff

ฉันคุ้นเคยกับ PostgreSQL มากที่สุดและเวอร์ชันก่อนหน้านี้ไม่ค่อยดีนักในการรวมแบบสอบถาม แต่คนที่ใหม่กว่านั้นดีกว่ามาก คำตอบของฉันใช้ไม่ได้มากอีกต่อไปอย่างน้อยสำหรับ DBMS นี้โดยเฉพาะ
Barry Brown

5

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


4

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

นอกจากนี้มุมมองมักใช้ในการปรับใช้ตรรกะทางธุรกิจ (ผู้ใช้ที่พ้นไปคือผู้ใช้ที่ไม่ได้เข้าสู่ระบบในช่วง 40 วันที่ผ่านมาซึ่งเป็นแบบนั้น)


ถ้าคุณทำให้เป็นปกติโดยการรวมตารางอ้างอิง 7 ตารางจากนั้นค้นหาสิ่งที่ต้องการเพียงตารางอ้างอิงใดตารางหนึ่งเท่านั้น นั่นเป็นความพยายามที่สูญเปล่ามาก สิ่งนี้จะแย่ลงถ้าคุณเริ่มเข้าร่วมมุมมองดังกล่าว
SquareCog

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

แอนโธนี่ลองจินตนาการถึงข้อความค้นหาเช่น "select foo_col from (select foo. *, bar. * from foo join bar on (foo.id = bar.id)" ในแบบสอบถามนี้การเลือกด้านในคือมุมมองของเรามันไม่ใช่ ชัดเจนว่าการรวมแถบสามารถทิ้งได้อย่างปลอดภัย (ในความเป็นจริงถ้าความสัมพันธ์ไม่ได้เป็น 1-1 อย่างเคร่งครัดก็ไม่สามารถทำได้) สิ่งนี้จะยุ่งยากยิ่งขึ้นด้วยการสืบค้นที่ซับซ้อนมากขึ้นและฉันไม่แนะนำให้ใช้ RDBMS ทั่วไปในการทำทั้งหมด การตัดแต่งกระป๋องของมนุษย์บางที SQL Server ทำได้ฉันจะตกใจถ้า MySQL ทำ Oracle? Postgres หรือไม่เช่นเคยอ่านแผนแบบสอบถามเมื่อมีข้อสงสัย
SquareCog

3

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


2

มุมมองเป็นเพียงคำสั่ง SELECT ที่จัดเก็บไว้ ลองนึกถึงมุมมองเช่นฟังก์ชันห้องสมุด


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

1

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


1

ฉันจำ SELECT ที่ยาวมากซึ่งเกี่ยวข้องกับ UNION หลายตัว UNION แต่ละตัวรวมการเข้าร่วมกับตารางราคาซึ่งสร้างขึ้นทันทีโดย SELECT ที่ค่อนข้างยาวและยากที่จะเข้าใจ ฉันคิดว่ามันเป็นความคิดที่ดีที่จะมีมุมมองที่จะสร้างตารางราคา มันจะทำให้ SELECT โดยรวมสั้นลงประมาณครึ่งหนึ่ง

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


Oracle CBO สามารถเลือกที่จะประเมินมุมมองครั้งเดียว (ทำให้เป็นจริงพวกเขาเรียกมันว่า) หรือรวม SQL สำหรับมุมมองลงในส่วนที่เหลือของคำสั่ง select และเรียกใช้สิ่งนั้น มันจะตัดสินใจตามสิ่งที่มีต้นทุนโดยประมาณที่ต่ำกว่า
WW.

หากคำสั่ง select เป็นค่าคงที่ตลอดทั้งแบบสอบถามและทำซ้ำหลาย ๆ ครั้งนิพจน์ตารางทั่วไป (CTE) สามารถแก้ไขปัญหาได้ สิ่งนี้ใช้ได้กับ SQL Server 2005/2008 เท่านั้นเนื่องจากไม่มีใน SQL Server 2000 ใช่มุมมองยังคงถูกเรียกใช้ซ้ำ ๆ
ผู้ลงทะเบียน

@ ผู้ใช้ที่ลงทะเบียน: CTE ไม่ใช่เฉพาะ SQL Server มีต้นกำเนิดใน DB2 และมีอยู่ใน PostgreSQL เช่นกัน (เนื่องจากมีประโยชน์และอยู่ในมาตรฐาน ISO SQL) ไม่ว่ามุมมองจะเป็นแบบอินไลน์หรือถือว่าเป็นแบล็คบ็อกซ์เป็นการใช้งานเฉพาะ RDBMS บางตัวจะฉลาดกว่ามุมมองอื่น
แค่ใครสักคน

@ just somebody: ความคิดเห็นของฉันถูก จำกัด ไว้ที่ SQL Server 2005/2008 เนื่องจากฉันไม่มีประสบการณ์กับ CTE ใน RBDMS อื่น ๆ นอกจากนี้ความคิดเห็นยังมีคุณสมบัติที่จะระบุว่าสิ่งนี้ใช้ไม่ได้กับ SQL Server 2000 เนื่องจาก CTE ไม่มีให้ใช้งานใน SQL Server ก่อนปี 2548
ผู้ใช้ที่ลงทะเบียน

อีกทางเลือกหนึ่งของมุมมองคือการวางตารางราคาไว้ในตารางชั่วคราวล่วงหน้า
SeaDrive

0

ทุกเวลาที่คุณต้องการ [my_interface]! = [user_interface]

ตัวอย่าง:

ตาราง A:

  • id
  • ข้อมูล

ดูตาราง A:

  • ข้อมูลลูกค้า

นี่เป็นวิธีที่คุณอาจซ่อนรหัสจากลูกค้าและเปลี่ยนชื่อข้อมูลเป็นชื่อที่ละเอียดมากขึ้นพร้อมกัน

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

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