ทำไมฐานข้อมูลถึงดำเนินการเกี่ยวกับการทำให้เป็นมาตรฐาน?
มันคืออะไร? มันช่วยได้อย่างไร?
มันใช้กับสิ่งที่อยู่นอกฐานข้อมูลหรือไม่?
ทำไมฐานข้อมูลถึงดำเนินการเกี่ยวกับการทำให้เป็นมาตรฐาน?
มันคืออะไร? มันช่วยได้อย่างไร?
มันใช้กับสิ่งที่อยู่นอกฐานข้อมูลหรือไม่?
คำตอบ:
Normalization นั้นมีไว้เพื่อออกแบบสคีมาฐานข้อมูลเพื่อหลีกเลี่ยงข้อมูลที่ซ้ำกันและซ้ำซ้อน หากข้อมูลบางส่วนซ้ำกันหลายตำแหน่งในฐานข้อมูลมีความเสี่ยงที่ข้อมูลนั้นจะได้รับการอัปเดตในที่เดียว แต่ไม่ใช่ข้อมูลอื่นซึ่งนำไปสู่ความเสียหายของข้อมูล
ระดับการทำให้เป็นมาตรฐานมีหลายระดับตั้งแต่ 1. รูปแบบปกติจนถึง 5. รูปแบบปกติ รูปแบบปกติแต่ละรูปแบบจะอธิบายถึงวิธีการกำจัดปัญหาเฉพาะบางอย่างโดยปกติจะเกี่ยวข้องกับความซ้ำซ้อน
ข้อผิดพลาดในการปรับมาตรฐานทั่วไปบางประการ:
(1) มีมากกว่าหนึ่งค่าในเซลล์ ตัวอย่าง:
UserId | Car
---------------------
1 | Toyota
2 | Ford,Cadillac
คอลัมน์ "รถยนต์" (ซึ่งเป็นสตริง) มีหลายค่า นั่นทำให้รูปแบบปกติแรกขุ่นเคืองซึ่งบอกว่าแต่ละเซลล์ควรมีเพียงค่าเดียว เราสามารถทำให้ปัญหานี้เป็นปกติได้โดยแยกแถวต่อคัน:
UserId | Car
---------------------
1 | Toyota
2 | Ford
2 | Cadillac
ปัญหาในการมีค่าหลายค่าในเซลล์เดียวคือการอัปเดตยุ่งยากยุ่งยากในการสืบค้นและคุณไม่สามารถใช้ดัชนีข้อ จำกัด และอื่น ๆ ได้
(2) การมีข้อมูลที่ไม่ใช่คีย์ซ้ำซ้อน (เช่นข้อมูลซ้ำหลายแถวโดยไม่จำเป็น) ตัวอย่าง:
UserId | UserName | Car
-----------------------
1 | John | Toyota
2 | Sue | Ford
2 | Sue | Cadillac
การออกแบบนี้เป็นปัญหาเนื่องจากชื่อซ้ำกันในแต่ละคอลัมน์แม้ว่าชื่อจะถูกกำหนดโดย UserId เสมอ สิ่งนี้ทำให้ในทางทฤษฎีเป็นไปได้ที่จะเปลี่ยนชื่อของ Sue ในหนึ่งแถวไม่ใช่อีกแถวซึ่งเป็นการเสียหายของข้อมูล ปัญหาได้รับการแก้ไขโดยการแบ่งตารางออกเป็นสองส่วนและสร้างความสัมพันธ์คีย์หลัก / คีย์ต่างประเทศ:
UserId(FK) | Car UserId(PK) | UserName
--------------------- -----------------
1 | Toyota 1 | John
2 | Ford 2 | Sue
2 | Cadillac
ตอนนี้อาจดูเหมือนว่าเรายังมีข้อมูลซ้ำซ้อนเนื่องจาก UserId ซ้ำกัน อย่างไรก็ตามข้อ จำกัด PK / FK ทำให้มั่นใจได้ว่าไม่สามารถอัปเดตค่าได้อย่างอิสระดังนั้นความสมบูรณ์จึงปลอดภัย
มันสำคัญหรือ? ใช่มันเป็นอย่างมากสำคัญการมีฐานข้อมูลที่มีข้อผิดพลาดในการทำให้เป็นมาตรฐานคุณจะเสี่ยงต่อการได้รับข้อมูลที่ไม่ถูกต้องหรือเสียหายในฐานข้อมูล เนื่องจากข้อมูล "อยู่ตลอดไป" จึงเป็นเรื่องยากมากที่จะกำจัดข้อมูลที่เสียหายเมื่อเข้าสู่ฐานข้อมูลเป็นครั้งแรก
ไม่ต้องกลัวของการฟื้นฟู คำจำกัดความทางเทคนิคอย่างเป็นทางการของระดับการทำให้เป็นมาตรฐานนั้นค่อนข้างป้าน มันทำให้ดูเหมือนว่าการทำให้เป็นมาตรฐานเป็นกระบวนการทางคณิตศาสตร์ที่ซับซ้อน อย่างไรก็ตามการทำให้เป็นมาตรฐานนั้นเป็นเพียงสามัญสำนึกและคุณจะพบว่าถ้าคุณออกแบบสคีมาฐานข้อมูลโดยใช้สามัญสำนึกโดยทั่วไปจะทำให้เป็นมาตรฐานโดยสมบูรณ์
มีความเข้าใจผิดหลายประการเกี่ยวกับการทำให้เป็นมาตรฐาน:
บางคนเชื่อว่าฐานข้อมูลปกติจะทำงานช้าลงและการทำให้เป็นมาตรฐานดีขึ้น อย่างไรก็ตามนี่เป็นเรื่องจริงในกรณีพิเศษเท่านั้น โดยทั่วไปแล้วฐานข้อมูลปกติจะเร็วที่สุดเช่นกัน
บางครั้งการทำให้เป็นมาตรฐานถูกอธิบายว่าเป็นกระบวนการออกแบบทีละน้อยและคุณต้องตัดสินใจ "เมื่อใดควรหยุด" แต่จริงๆแล้วระดับการทำให้เป็นมาตรฐานนั้นอธิบายถึงปัญหาเฉพาะที่แตกต่างกัน ปัญหาที่แก้ไขโดยรูปแบบปกติเหนือ NF ที่ 3 เป็นปัญหาที่หายากมากในตอนแรกดังนั้นโอกาสที่สคีมาของคุณจะอยู่ใน 5NF แล้ว
มันใช้กับสิ่งที่อยู่นอกฐานข้อมูลหรือไม่? ไม่โดยตรงไม่ หลักการของการทำให้เป็นมาตรฐานนั้นค่อนข้างเฉพาะเจาะจงสำหรับฐานข้อมูลเชิงสัมพันธ์ อย่างไรก็ตามธีมพื้นฐานทั่วไปที่คุณไม่ควรมีข้อมูลซ้ำกันหากอินสแตนซ์ต่างๆสามารถไม่ซิงค์กันสามารถนำไปใช้ในวงกว้างได้ นี้เป็นพื้นหลักการแห้ง
กฎของการทำให้เป็นมาตรฐาน (ที่มา: ไม่ทราบ)
... ดังนั้นช่วยฉันCodd
ที่สำคัญที่สุดคือทำหน้าที่ลบการทำซ้ำจากบันทึกฐานข้อมูล ตัวอย่างเช่นหากคุณมีสถานที่ (ตาราง) มากกว่าหนึ่งแห่งที่สามารถสร้างชื่อบุคคลได้ให้คุณย้ายชื่อไปยังตารางแยกต่างหากและอ้างอิงจากที่อื่น วิธีนี้หากคุณต้องการเปลี่ยนชื่อบุคคลในภายหลังคุณจะต้องเปลี่ยนในที่เดียวเท่านั้น
เป็นสิ่งสำคัญสำหรับการออกแบบฐานข้อมูลที่เหมาะสมและในทางทฤษฎีคุณควรใช้มันให้มากที่สุดเพื่อรักษาความสมบูรณ์ของข้อมูล อย่างไรก็ตามเมื่อดึงข้อมูลจากตารางจำนวนมากคุณจะสูญเสียประสิทธิภาพไปบางส่วนและนั่นเป็นเหตุผลว่าทำไมบางครั้งคุณจึงเห็นตารางฐานข้อมูลที่ผิดปกติ (เรียกอีกอย่างว่าแบน) ที่ใช้ในแอปพลิเคชันที่สำคัญด้านประสิทธิภาพ
คำแนะนำของฉันคือเริ่มต้นด้วยการทำให้เป็นมาตรฐานที่ดีและทำการ de-normalization เมื่อจำเป็นจริงๆเท่านั้น
PS ตรวจสอบบทความนี้ด้วย: http://en.wikipedia.org/wiki/Database_normalizationเพื่ออ่านเพิ่มเติมเกี่ยวกับเรื่องนี้และเกี่ยวกับสิ่งที่เรียกว่ารูปแบบปกติที่
Normalization เป็นโพรซีเดอร์ที่ใช้เพื่อกำจัดความซ้ำซ้อนและการอ้างอิงการทำงานระหว่างคอลัมน์ในตาราง
มีอยู่หลายรูปแบบปกติโดยทั่วไปจะระบุด้วยตัวเลข จำนวนที่สูงขึ้นหมายถึงความซ้ำซ้อนและการอ้างอิงน้อยลง ตาราง SQL ใด ๆ อยู่ใน 1NF (รูปแบบปกติแรกตามความหมายค่อนข้างมาก) Normalizing หมายถึงการเปลี่ยนสคีมา (มักแบ่งตาราง) ในลักษณะย้อนกลับโดยให้โมเดลที่เหมือนกันในการทำงานยกเว้นมีความซ้ำซ้อนและการอ้างอิงน้อยกว่า
ความซ้ำซ้อนและการพึ่งพาข้อมูลเป็นสิ่งที่ไม่พึงปรารถนาเนื่องจากอาจทำให้เกิดความไม่สอดคล้องกันเมื่อแก้ไขข้อมูล
มีวัตถุประสงค์เพื่อลดความซ้ำซ้อนของข้อมูล
สำหรับการสนทนาที่เป็นทางการมากขึ้นโปรดดูที่ Wikipedia http://en.wikipedia.org/wiki/Database_normalization
ฉันจะยกตัวอย่างที่ค่อนข้างง่าย
สมมติฐานข้อมูลขององค์กรที่มักมีสมาชิกในครอบครัว
id, name, address
214 Mr. Chris 123 Main St.
317 Mrs. Chris 123 Main St.
สามารถทำให้เป็นมาตรฐานได้
id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27
และโต๊ะสำหรับครอบครัว
ID, address
27 123 Main St.
Near-Complete normalization (BCNF) มักไม่ใช้ในการผลิต แต่เป็นขั้นตอนกลาง เมื่อคุณใส่ฐานข้อมูลใน BCNF แล้วขั้นตอนต่อไปคือการยกเลิกการทำให้เป็นมาตรฐานโดยใช้วิธีเชิงตรรกะเพื่อเร่งความเร็วการสืบค้นและลดความซับซ้อนของส่วนแทรกทั่วไปบางอย่าง อย่างไรก็ตามคุณไม่สามารถทำได้ดีโดยไม่ต้องทำให้เป็นปกติก่อน
แนวคิดที่ว่าข้อมูลที่ซ้ำซ้อนจะลดลงเหลือเพียงรายการเดียว สิ่งนี้มีประโยชน์อย่างยิ่งในช่องต่างๆเช่นที่อยู่ซึ่ง Mr. Chris ส่งที่อยู่ของเขาเป็น Unit-7123 Main St. และ Mrs. Chris แสดงรายการ Suite-7123 Main Street ซึ่งจะแสดงในตารางเดิมเป็นที่อยู่สองแห่งที่แตกต่างกัน
โดยทั่วไปเทคนิคที่ใช้คือการค้นหาองค์ประกอบที่ซ้ำและแยกฟิลด์เหล่านั้นออกเป็นตารางอื่นด้วยรหัสเฉพาะและแทนที่องค์ประกอบที่ซ้ำด้วยคีย์หลักที่อ้างถึงตารางใหม่
อ้างถึงวันที่ CJ: ทฤษฎีสามารถใช้ได้จริง
การออกจากการทำให้เป็นมาตรฐานจะส่งผลให้เกิดความผิดปกติบางอย่างในฐานข้อมูลของคุณ
การออกจาก First Normal Form จะทำให้เกิดความผิดปกติในการเข้าถึงซึ่งหมายความว่าคุณต้องแยกย่อยและสแกนค่าแต่ละค่าเพื่อค้นหาสิ่งที่คุณกำลังมองหา ตัวอย่างเช่นถ้าค่าใดค่าหนึ่งคือสตริง "Ford, Cadillac" ตามที่ได้รับจากการตอบกลับก่อนหน้านี้และคุณกำลังมองหาโอกาสทั้งหมดของ "Ford" คุณจะต้องเปิดสตริงและดูที่ สตริงย่อย การทำเช่นนี้เป็นการเอาชนะจุดประสงค์ของการจัดเก็บข้อมูลในฐานข้อมูลเชิงสัมพันธ์ในระดับหนึ่ง
คำจำกัดความของ First Normal Form ได้เปลี่ยนไปตั้งแต่ปี 1970 แต่ความแตกต่างเหล่านั้นไม่จำเป็นต้องเกี่ยวข้องกับคุณในตอนนี้ ถ้าคุณออกแบบตาราง SQL ของคุณโดยใช้โมเดลข้อมูลเชิงสัมพันธ์ตารางของคุณจะอยู่ใน 1NF โดยอัตโนมัติ
การออกจากรูปแบบปกติที่สองขึ้นไปจะทำให้เกิดความผิดปกติในการอัปเดตเนื่องจากข้อเท็จจริงเดียวกันนี้ถูกเก็บไว้ในที่ต่างๆมากกว่าหนึ่งแห่ง ปัญหาเหล่านี้ทำให้ไม่สามารถจัดเก็บข้อเท็จจริงบางอย่างโดยไม่จัดเก็บข้อเท็จจริงอื่น ๆ ที่อาจไม่มีอยู่จริงดังนั้นจึงต้องมีการคิดค้น หรือเมื่อข้อเท็จจริงเปลี่ยนไปคุณอาจต้องค้นหาสถานที่ทั้งหมดที่จัดเก็บข้อเท็จจริงและอัปเดตสถานที่เหล่านั้นทั้งหมดเพื่อมิให้คุณได้ฐานข้อมูลที่ขัดแย้งกับตัวเอง และเมื่อคุณไปลบแถวออกจากฐานข้อมูลคุณอาจพบว่าหากคุณทำเช่นนั้นคุณกำลังลบที่เดียวที่ยังคงมีการจัดเก็บข้อเท็จจริงที่จำเป็น
ปัญหาเหล่านี้เป็นปัญหาเชิงตรรกะไม่ใช่ปัญหาด้านประสิทธิภาพหรือปัญหาพื้นที่ บางครั้งคุณสามารถหลีกเลี่ยงความผิดปกติของการอัปเดตเหล่านี้ได้โดยการเขียนโปรแกรมอย่างระมัดระวัง บางครั้ง (บ่อยครั้ง) เป็นการดีกว่าที่จะป้องกันปัญหาตั้งแต่แรกโดยยึดมั่นในรูปแบบปกติ
แม้ว่าจะมีการกล่าวถึงคุณค่าในสิ่งที่กล่าวไปแล้ว แต่ก็ควรกล่าวถึงว่าการทำให้เป็นมาตรฐานเป็นแนวทางจากล่างขึ้นบนไม่ใช่แนวทางจากบนลงล่าง หากคุณปฏิบัติตามวิธีการบางอย่างในการวิเคราะห์ข้อมูลและในการออกแบบเบื้องต้นคุณสามารถรับประกันได้ว่าการออกแบบจะสอดคล้องกับ 3NF อย่างน้อยที่สุด ในหลายกรณีการออกแบบจะถูกทำให้เป็นมาตรฐานโดยสมบูรณ์
ในกรณีที่คุณอาจต้องการใช้แนวคิดที่สอนภายใต้การทำให้เป็นมาตรฐานคือเมื่อคุณได้รับข้อมูลเดิมจากฐานข้อมูลเดิมหรือจากไฟล์ที่ประกอบด้วยบันทึกและข้อมูลได้รับการออกแบบโดยไม่คำนึงถึงรูปแบบปกติโดยสิ้นเชิงและผลของการจากไป จากพวกเขา. ในกรณีเหล่านี้คุณอาจต้องค้นหาการแยกออกจากการทำให้เป็นมาตรฐานและแก้ไขการออกแบบ
คำเตือน: การทำให้เป็นมาตรฐานมักจะถูกสอนด้วยเสียงหวือหวาทางศาสนาราวกับว่าการออกจากการทำให้เป็นมาตรฐานเต็มรูปแบบเป็นบาปความผิดต่อ Codd (เล่นสำนวนเล็กน้อย) อย่าซื้อสิ่งนั้น เมื่อคุณเรียนรู้การออกแบบฐานข้อมูลอย่างแท้จริงคุณไม่เพียง แต่รู้วิธีปฏิบัติตามกฎเท่านั้น แต่ยังรู้ด้วยว่าเมื่อใดที่จะทำลายพวกเขาได้อย่างปลอดภัย
Normalization เป็นหนึ่งในแนวคิดพื้นฐาน หมายความว่าสองสิ่งไม่มีอิทธิพลซึ่งกันและกัน
ในฐานข้อมูลโดยเฉพาะหมายความว่าตารางสองตาราง (หรือมากกว่า) ไม่มีข้อมูลเดียวกันกล่าวคือไม่มีความซ้ำซ้อนใด ๆ
ในครั้งแรกที่เห็นว่าดีมากเพราะโอกาสของคุณที่จะทำให้ปัญหาการซิงโครไนซ์ใกล้เคียงกับศูนย์คุณมักจะรู้ว่าข้อมูลของคุณอยู่ที่ไหน ฯลฯ แต่อาจเป็นไปได้ว่าจำนวนตารางของคุณจะเพิ่มขึ้นและคุณจะมีปัญหาในการข้ามข้อมูล และเพื่อรับผลสรุป
ดังนั้นในตอนท้ายคุณจะเสร็จสิ้นด้วยการออกแบบฐานข้อมูลที่ไม่ได้ทำให้เป็นมาตรฐานอย่างแท้จริงโดยมีความซ้ำซ้อนบางอย่าง (จะอยู่ในระดับที่เป็นไปได้บางส่วนของการทำให้เป็นมาตรฐาน)
Normalization คืออะไร?
การทำให้เป็นมาตรฐานเป็นขั้นตอนที่เป็นทางการที่ชาญฉลาดซึ่งช่วยให้เราสามารถย่อยสลายตารางฐานข้อมูลในลักษณะที่ลดความผิดปกติของข้อมูลและความผิดปกติของการอัปเดต
กระบวนการ Normalization
มารยาท
รูปแบบปกติครั้งแรกถ้าโดเมนของแต่ละแอตทริบิวต์มีเฉพาะค่าอะตอม (ค่าอะตอมเป็นค่าที่ไม่สามารถแบ่งออกได้) และค่าของแต่ละแอตทริบิวต์มีเพียงค่าเดียวจากโดเมนนั้น (ตัวอย่าง: - โดเมนสำหรับ คอลัมน์เพศคือ "M", "F")
รูปแบบปกติแรกบังคับใช้เกณฑ์เหล่านี้:
รูปแบบปกติที่สอง = 1NF + ไม่มีการอ้างอิงบางส่วนเช่นแอตทริบิวต์ที่ไม่ใช่คีย์ทั้งหมดทำงานได้อย่างสมบูรณ์ขึ้นอยู่กับคีย์หลัก
รูปแบบปกติที่สาม = 2NF + ไม่มีการพึ่งพาสกรรมกริยากล่าวคือแอตทริบิวต์ที่ไม่ใช่คีย์ทั้งหมดทำงานได้อย่างสมบูรณ์ขึ้นอยู่กับคีย์หลักโดยตรงเท่านั้น
Boyce – Codd รูปแบบปกติ (หรือ BCNF หรือ 3.5NF) เป็นรูปแบบปกติที่สามที่แข็งแกร่งกว่าเล็กน้อย (3NF)
หมายเหตุ: - รูปแบบปกติที่สองสามและ Boyce – Codd เกี่ยวข้องกับการพึ่งพาการทำงาน ตัวอย่าง
รูปแบบปกติที่สี่ = 3NF + ลบการอ้างอิงหลายค่า
รูปแบบปกติที่ห้า = 4NF + ลบการขึ้นต่อกัน
ดังที่ Martin Kleppman กล่าวไว้ในหนังสือ Designing Data Intensive Applications:
วรรณคดีเกี่ยวกับแบบจำลองเชิงสัมพันธ์ได้แยกแยะรูปแบบปกติที่แตกต่างกันออกไป แต่ความแตกต่างนั้นไม่ค่อยมีประโยชน์ในทางปฏิบัติ ตามหลักการทั่วไปหากคุณกำลังทำสำเนาค่าที่สามารถจัดเก็บได้ในที่เดียวสคีมาจะไม่ถูกทำให้เป็นมาตรฐาน
ช่วยป้องกันข้อมูลที่ซ้ำกัน (และแย่กว่านั้นคือขัดแย้งกัน)
อาจส่งผลเสียต่อประสิทธิภาพการทำงานได้