Normalization (หรือ Normalization) คืออะไร?


104

ทำไมฐานข้อมูลถึงดำเนินการเกี่ยวกับการทำให้เป็นมาตรฐาน?

มันคืออะไร? มันช่วยได้อย่างไร?

มันใช้กับสิ่งที่อยู่นอกฐานข้อมูลหรือไม่?

คำตอบ:


171

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 แล้ว

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


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

2
@ บิล: ทำไมคุณคิดว่าตัวอย่างที่ฉันให้ไว้ไม่ถูกต้อง? คุณรู้คำจำกัดความของ 1NF ที่เป็นตัวอย่างหรือไม่?
JacquesB

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

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

@ Lealo: หลักการนี้ใช้กับ OOP ในขอบเขตที่คุณไม่ควรมีข้อมูลเดียวกัน (ในรูปแบบที่ไม่แน่นอน) ในวัตถุสองชิ้นที่แตกต่างกันเนื่องจากอาจไม่ซิงค์กัน
JacquesB

45

กฎของการทำให้เป็นมาตรฐาน (ที่มา: ไม่ทราบ)

  • คีย์ ( 1NF )
  • คีย์ทั้งหมด ( 2NF )
  • และไม่มีอะไรนอกจากกุญแจ ( 3NF )

... ดังนั้นช่วยฉันCodd


12
ฉันคิดว่ามันคลุมเครือเล็กน้อยหากไม่มีบริบทที่เหมาะสมใช่ไหม
Rik

3
อาจจะคลุมเครือเล็กน้อย แต่เป็นการเตือนความจำที่ดีสำหรับผู้ที่มีบริบท ฉันรู้ว่าการทำให้เป็นมาตรฐานคืออะไรและจะดำเนินการอย่างไร แต่ฉันจำไม่ได้ว่าแต่ละรูปแบบคืออะไร
Benjamin Autin

1
วิกิพีเดียอธิบายสิ่งนี้ไว้ที่นี่ - "การกำหนดให้มี" คีย์ "เพื่อให้แน่ใจว่าตารางอยู่ใน 1NF การกำหนดให้แอตทริบิวต์ที่ไม่ใช่คีย์ขึ้นอยู่กับ" คีย์ทั้งหมด "ทำให้มั่นใจได้ว่า 2NF กำหนดให้แอตทริบิวต์ที่ไม่ใช่คีย์ขึ้นอยู่กับ" ไม่มีอะไร แต่คีย์ "ทำให้มั่นใจได้ว่า 3NF"
Kcats Wolfrevo

ตามวิกิพีเดียแหล่งที่มาคือ Bill Kent: "[แอตทริบิวต์] ที่ไม่ใช่คีย์ [ทุก] ต้องให้ข้อเท็จจริงเกี่ยวกับคีย์คีย์ทั้งหมดและไม่มีอะไรเลยนอกจากคีย์"
apteryx

19

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

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

คำแนะนำของฉันคือเริ่มต้นด้วยการทำให้เป็นมาตรฐานที่ดีและทำการ de-normalization เมื่อจำเป็นจริงๆเท่านั้น

PS ตรวจสอบบทความนี้ด้วย: http://en.wikipedia.org/wiki/Database_normalizationเพื่ออ่านเพิ่มเติมเกี่ยวกับเรื่องนี้และเกี่ยวกับสิ่งที่เรียกว่ารูปแบบปกติที่


นอกจากนี้คุณยังค่อนข้างแปลกใจว่าแอพที่ทำธุรกรรมนั้นมีความจำเป็นเพียงเล็กน้อย ในแอปพลิเคชันมอนสเตอร์ตัวหนึ่งที่ฉันสร้างแบบจำลองข้อมูลสคีมาที่มี 560 ตารางมีข้อมูลที่ผิดปกติเพียง 4 รายการ
ConcernedOfTunbridgeWells

ป้องกัน "อัปเดตความผิดปกติ" ทำได้โดยการกำจัดการทำซ้ำบางประเภท
ล็อ

"คำแนะนำของฉันคือเริ่มต้นด้วยการทำให้ปกติในระดับที่ดีและทำการ de-normalization เมื่อจำเป็นจริงๆเท่านั้น" คำแนะนำนี้เป็นคำแนะนำที่แย่มาก! ฉันยังไม่เห็นภาพประกอบที่เหมาะสมของ "ทฤษฎีหลอก" นี้ ลบ 1
Philippe Grondier

7

Normalization เป็นโพรซีเดอร์ที่ใช้เพื่อกำจัดความซ้ำซ้อนและการอ้างอิงการทำงานระหว่างคอลัมน์ในตาราง

มีอยู่หลายรูปแบบปกติโดยทั่วไปจะระบุด้วยตัวเลข จำนวนที่สูงขึ้นหมายถึงความซ้ำซ้อนและการอ้างอิงน้อยลง ตาราง SQL ใด ๆ อยู่ใน 1NF (รูปแบบปกติแรกตามความหมายค่อนข้างมาก) Normalizing หมายถึงการเปลี่ยนสคีมา (มักแบ่งตาราง) ในลักษณะย้อนกลับโดยให้โมเดลที่เหมือนกันในการทำงานยกเว้นมีความซ้ำซ้อนและการอ้างอิงน้อยกว่า

ความซ้ำซ้อนและการพึ่งพาข้อมูลเป็นสิ่งที่ไม่พึงปรารถนาเนื่องจากอาจทำให้เกิดความไม่สอดคล้องกันเมื่อแก้ไขข้อมูล


5

มีวัตถุประสงค์เพื่อลดความซ้ำซ้อนของข้อมูล

สำหรับการสนทนาที่เป็นทางการมากขึ้นโปรดดูที่ 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 ซึ่งจะแสดงในตารางเดิมเป็นที่อยู่สองแห่งที่แตกต่างกัน

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


1
BCNF ไม่ "สมบูรณ์แบบ" มีรูปแบบปกติที่สูงขึ้นถึง 6NF โดยที่ตารางทั้งหมดของคุณเป็นเพียงคีย์และค่าข้อมูล แทบจะไม่เคยใช้เลย
Rik

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

3

อ้างถึงวันที่ CJ: ทฤษฎีสามารถใช้ได้จริง

การออกจากการทำให้เป็นมาตรฐานจะส่งผลให้เกิดความผิดปกติบางอย่างในฐานข้อมูลของคุณ

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

คำจำกัดความของ First Normal Form ได้เปลี่ยนไปตั้งแต่ปี 1970 แต่ความแตกต่างเหล่านั้นไม่จำเป็นต้องเกี่ยวข้องกับคุณในตอนนี้ ถ้าคุณออกแบบตาราง SQL ของคุณโดยใช้โมเดลข้อมูลเชิงสัมพันธ์ตารางของคุณจะอยู่ใน 1NF โดยอัตโนมัติ

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

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

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

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

คำเตือน: การทำให้เป็นมาตรฐานมักจะถูกสอนด้วยเสียงหวือหวาทางศาสนาราวกับว่าการออกจากการทำให้เป็นมาตรฐานเต็มรูปแบบเป็นบาปความผิดต่อ Codd (เล่นสำนวนเล็กน้อย) อย่าซื้อสิ่งนั้น เมื่อคุณเรียนรู้การออกแบบฐานข้อมูลอย่างแท้จริงคุณไม่เพียง แต่รู้วิธีปฏิบัติตามกฎเท่านั้น แต่ยังรู้ด้วยว่าเมื่อใดที่จะทำลายพวกเขาได้อย่างปลอดภัย


2

Normalization เป็นหนึ่งในแนวคิดพื้นฐาน หมายความว่าสองสิ่งไม่มีอิทธิพลซึ่งกันและกัน

ในฐานข้อมูลโดยเฉพาะหมายความว่าตารางสองตาราง (หรือมากกว่า) ไม่มีข้อมูลเดียวกันกล่าวคือไม่มีความซ้ำซ้อนใด ๆ

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

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


2

Normalization คืออะไร?

การทำให้เป็นมาตรฐานเป็นขั้นตอนที่เป็นทางการที่ชาญฉลาดซึ่งช่วยให้เราสามารถย่อยสลายตารางฐานข้อมูลในลักษณะที่ลดความผิดปกติของข้อมูลและความผิดปกติของการอัปเดต

กระบวนการ Normalization
ป้อนคำอธิบายภาพที่นี่ มารยาท

รูปแบบปกติครั้งแรกถ้าโดเมนของแต่ละแอตทริบิวต์มีเฉพาะค่าอะตอม (ค่าอะตอมเป็นค่าที่ไม่สามารถแบ่งออกได้) และค่าของแต่ละแอตทริบิวต์มีเพียงค่าเดียวจากโดเมนนั้น (ตัวอย่าง: - โดเมนสำหรับ คอลัมน์เพศคือ "M", "F")

รูปแบบปกติแรกบังคับใช้เกณฑ์เหล่านี้:

  • กำจัดกลุ่มที่ซ้ำกันในแต่ละตาราง
  • สร้างตารางแยกต่างหากสำหรับชุดข้อมูลที่เกี่ยวข้องแต่ละชุด
  • ระบุชุดข้อมูลที่เกี่ยวข้องแต่ละชุดด้วยคีย์หลัก

รูปแบบปกติที่สอง = 1NF + ไม่มีการอ้างอิงบางส่วนเช่นแอตทริบิวต์ที่ไม่ใช่คีย์ทั้งหมดทำงานได้อย่างสมบูรณ์ขึ้นอยู่กับคีย์หลัก

รูปแบบปกติที่สาม = 2NF + ไม่มีการพึ่งพาสกรรมกริยากล่าวคือแอตทริบิวต์ที่ไม่ใช่คีย์ทั้งหมดทำงานได้อย่างสมบูรณ์ขึ้นอยู่กับคีย์หลักโดยตรงเท่านั้น

Boyce – Codd รูปแบบปกติ (หรือ BCNF หรือ 3.5NF) เป็นรูปแบบปกติที่สามที่แข็งแกร่งกว่าเล็กน้อย (3NF)

หมายเหตุ: - รูปแบบปกติที่สองสามและ Boyce – Codd เกี่ยวข้องกับการพึ่งพาการทำงาน ตัวอย่าง

รูปแบบปกติที่สี่ = 3NF + ลบการอ้างอิงหลายค่า

รูปแบบปกติที่ห้า = 4NF + ลบการขึ้นต่อกัน


1

ดังที่ Martin Kleppman กล่าวไว้ในหนังสือ Designing Data Intensive Applications:

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


-10

ช่วยป้องกันข้อมูลที่ซ้ำกัน (และแย่กว่านั้นคือขัดแย้งกัน)

อาจส่งผลเสียต่อประสิทธิภาพการทำงานได้


เมื่อทำงานกับทั้งข้อมูลที่เป็นมาตรฐานและข้อมูลที่ไม่เป็นมาตรฐานฉันชอบการลดความเร็วด้วยการทำให้เป็นมาตรฐานมากกว่าการสูญเสียหรือมีปัญหาในการดูแลรักษาแอปพลิเคชันหรือฐานข้อมูล
Schalk Versteeg

1
เครื่องมือฐานข้อมูลสมัยใหม่ใช้การแคชซึ่งมักทำให้ฐานข้อมูลปกติมีประสิทธิภาพมากกว่าฐานข้อมูลที่ไม่ได้ทำให้เป็นมาตรฐาน หากมีข้อสงสัยให้ทำการวัด
สตีเวนอ. โลว์

1
การออกแบบที่ผิดปกติอาจเร็วกว่าสำหรับข้อความค้นหาหนึ่ง ๆ แต่การออกแบบที่เป็นมาตรฐานจะทำให้เกิดการประนีประนอมโดยให้ประสิทธิภาพที่เหมาะสมสำหรับข้อความค้นหาที่หลากหลายมากขึ้น
Bill Karwin

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

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