เมื่อใดที่คุณควรทำให้เป็นปกติ


45

ผมคิดว่าเราทุกคนคุ้นเคยกับการฟื้นฟูฐานข้อมูล

คำถามของฉันคือ: อะไรคือแนวทางที่คุณใช้เมื่อคุณต้องการทำให้ตารางผิดปกติ?


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


1
ข้อมูลซ้ำซ้อน / เป็นไปได้ที่จะทำการออกแบบฐานข้อมูล
John Sansom

คำตอบ:


34

ทำให้เป็นปกติเมื่อใช้งาน OLAP ให้ทำมาตรฐานเมื่อ OLTP (จากบทความที่เชื่อมโยงภายใต้หัวข้อการทำให้เป็นปกติ)

ฐานข้อมูลที่มีไว้สำหรับการประมวลผลธุรกรรมออนไลน์ (OLTP) โดยปกติแล้วจะเป็นมาตรฐานมากกว่าฐานข้อมูลที่มีไว้สำหรับการประมวลผลการวิเคราะห์ออนไลน์ (OLAP) แอปพลิเคชัน OLTP มีลักษณะเป็นธุรกรรมขนาดเล็กจำนวนมากเช่นการปรับปรุงบันทึกการขายที่เคาน์เตอร์ชำระเงินซูเปอร์มาร์เก็ต ความคาดหวังคือแต่ละธุรกรรมจะออกจากฐานข้อมูลในสถานะที่สอดคล้องกัน ในทางตรงกันข้ามฐานข้อมูลที่มีไว้สำหรับการดำเนินการ OLAP นั้นส่วนใหญ่จะเป็นฐานข้อมูล "อ่านส่วนใหญ่" แอปพลิเคชัน OLAP มักจะดึงข้อมูลประวัติที่สะสมมาเป็นระยะเวลานาน สำหรับฐานข้อมูลดังกล่าวข้อมูลที่ซ้ำซ้อนหรือ "denormalized" อาจช่วยให้แอปพลิเคชันระบบธุรกิจอัจฉริยะ ตารางมิติในสคีมาของดาวมักจะมีข้อมูลที่ผิดปกติ ข้อมูลที่ผิดปกติหรือซ้ำซ้อนจะต้องได้รับการควบคุมอย่างรอบคอบในระหว่างการแยก, การแปลง, การโหลด (ETL) และผู้ใช้ไม่ควรได้รับอนุญาตให้ดูข้อมูลจนกว่าจะอยู่ในสถานะที่สอดคล้องกัน ทางเลือกปกติของสคีตาร์คือสคีเกล็ดหิมะ ในหลายกรณีความต้องการ denormalization ได้จางหายไปเมื่อคอมพิวเตอร์และซอฟต์แวร์ RDBMS มีประสิทธิภาพมากขึ้น แต่เนื่องจากปริมาณข้อมูลที่เพิ่มขึ้นโดยทั่วไปพร้อมกับประสิทธิภาพของฮาร์ดแวร์และซอฟต์แวร์ฐานข้อมูล OLAP มักจะยังคงใช้ schema แบบปกติ

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


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

รวบรัดและเป็นประโยชน์อย่างมาก ฉันทำงานเกี่ยวกับรอบนอกของ DBA และสิ่งนี้ช่วยนำสิ่งต่างๆมารวมกันเป็นวงกลม
Jason P Sallinger

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

22

ทำให้เป็นปกติจนกว่าจะเจ็บและทำให้เป็นปกติจนกว่ามันจะทำงาน (เช่น: ประสิทธิภาพเป็นที่ยอมรับ) :)


5
นี่อาจจะไม่ใช่คำตอบที่ดีที่สุด แต่ก็เป็นหนึ่งในสิ่งที่ดีที่สุดหนึ่งสมุทรฉันเคยเห็นในกองมากเกิน :)
โอเว่น

15

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

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

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

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


4

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


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

3

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

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

ให้ฉันสาธิตวิธีการใช้กฎธุรกิจนี้โดยใช้ข้อ จำกัด FK และ CHECK เท่านั้นซึ่งจะรับประกันได้ว่าข้อมูลทั้งหมดเป็นไปตามกฎเกณฑ์ทางธุรกิจตราบใดที่ข้อ จำกัด ทั้งหมดเชื่อถือได้

อีกตัวอย่างหนึ่งคือวิธีการบังคับว่าช่วงเวลาไม่มีช่องว่างและไม่มีการทับซ้อน


1
"ฉันทำผิดปกติเป็นประจำเพื่อให้ฉันสามารถบังคับใช้ความถูกต้องของข้อมูลด้วยข้อ จำกัด " กันที่นี่ มันเป็นการปิดดี: คุณ denormalize นิด ๆ หน่อย ๆ แต่ได้รับDRI
Nick Chammas

@NickChammas - มันน่าสนใจมาก คุณสามารถแบ่งปันสถานการณ์สมมติเมื่อคุณทำสิ่งนั้นได้หรือไม่?
AK

1
อย่างแน่นอน เรามีระบบการปฏิบัติตามซึ่งรวมถึงรายการที่ต้องเติมเต็ม มีเป็นFulfillableตารางที่มีรายละเอียดทั้งหมดในแต่ละรายการ Fulfillable และแล้วก็มีเป็นFulfillableQueueตารางที่ใช้คิวใน SQL Server เฉพาะ Fulfillables ที่มีค่าคงที่เท่านั้นที่StateIDอาจอยู่ในคิว StateIDอยู่ในFulfillableตาราง แต่ฉันทำซ้ำFulfillableQueueและบังคับใช้ข้อ จำกัด นี้ด้วยFOREIGN KEYและCHECKข้อ จำกัด
Nick Chammas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.