ฉันจะโต้แย้งกับคอลัมน์ฐานข้อมูลที่ซ้ำกันอย่างมั่นใจได้อย่างไร


47

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

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

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


2
การ "ไม่สะดวกสบายในการเขียนเข้าร่วม" หมายความว่าอย่างไร พวกเขาอธิบายได้อย่างไร
scriptin

9
คนเหล่านี้ใช้ได้ผลสำหรับคุณหรือไม่ คุณเป็นหัวหน้างานของพวกเขา? ที่สุดของความสมเหตุสมผลของคุณสามารถพบได้ที่นี่: en.wikipedia.org/wiki/Database_normalization ใช่พวกเขาจำเป็นต้องใช้การรวมที่ดีขึ้น
Robert Harvey

1
คุณได้ดูบทความเกี่ยวกับสาเหตุที่เป็นที่ต้องการของการทำให้เป็นมาตรฐานหรือไม่?
นาธาน Tuggy

17
จะไม่เพิ่มมุมมองที่เข้าร่วมภายในทำให้การเขียนแบบสอบถามเป็นเรื่องง่ายเหมือนกันหรือไม่ คุณสามารถแนะนำพวกเขาเป็นทางเลือก
CodesInChaos

1
คุณสื่อสารสิ่งนี้ (อย่างสุภาพ) กับเพื่อนและรุ่นพี่หรือไม่? อะไรคือเหตุผลของพวกเขาสิ่งที่พวกเขากำลังพิจารณา? มีสาเหตุที่เป็นไปได้หลายประการที่อาจเป็นความคิดที่ดี (แม้ว่าคุณจะพูดว่า "การแสดงไม่ใช่เหตุผล" หลักฐานอะไรบ้างที่คุณต้องสนับสนุนสิ่งนั้น) ก่อนที่จะกล่าวหาพวกเขาว่าขี้เกียจเกินไปและ / หรือเข้มงวดคุณเคยพิจารณา (และถาม) สาเหตุที่พวกเขามีต่อการออกแบบในแบบที่เป็นหรือไม่? อาจมีการอ่านมากกว่าการเขียน (ฐานข้อมูลวิเคราะห์หนัก) เปลี่ยนการติดตาม? ข้อมูลทางประวัติศาสตร์? ถามทุกคน - บางคนอาจรู้เหตุผลที่แท้จริง
Luaan

คำตอบ:


128

ฐานข้อมูลการดำเนินงานของคุณควรจะปกติสูงเพื่อลดความผิดปกติ

ฐานข้อมูลการวิเคราะห์ของคุณ (คลังสินค้า) ควรมีความผิดปกติอย่างมาก

หากคุณไม่มีฐานข้อมูลการวิเคราะห์แยกต่างหากคุณควรสร้างมุมมอง [materialized] ที่มีความผิดปกติอย่างมาก

หากคุณบอกนักวิเคราะห์ธุรกิจ / ผู้จัดการอาวุโสของคุณให้เข้าร่วมมากมายสำหรับการวิเคราะห์อย่างง่ายคุณอาจถูกไล่ออก

การออกแบบคลังข้อมูล Agileเป็นหนังสือที่ดี

ดูเคล็ดลับคลังข้อมูลสกปรกด่วนของฉันที่นี่


9
นี่เป็นวิธีที่ถูกต้อง
นิด

6
+1 นี่คือสิ่งที่ Views มีไว้สำหรับ: การอนุญาตให้ดู denormalized บนฐานข้อมูลปกติ
Nzall

4
ถูกต้องอย่างแน่นอน แต่ฉันคิดว่า "ลดความผิดปกติ" ควรเน้นมากขึ้นเนื่องจากเป็นคำตอบหลักของคำถาม ความผิดปกติที่พบบ่อยที่สุด (เท่านั้น?) ที่คุณจะเห็นด้วยการทำซ้ำข้อมูล / การลดความแปรปรวนคือคอลัมน์จะได้รับข้อมูลที่ขัดแย้งกันในเวลาเดียวกันทำให้คุณไม่ทราบว่าข้อมูลจริงควรเป็นอะไรและไม่มี วิธีการพิจารณาสิ่งที่ผิดพลาด สิ่งหลังสามารถลดลงได้ด้วยการติดตามการเปลี่ยนแปลงครั้งใหญ่ แต่สิ่งนี้จะไม่ถูกหรือรวดเร็วในการค้นหาและแก้ไขปัญหา คุ้มค่ามากขึ้นเพื่อหลีกเลี่ยงปัญหาทั้งหมด
jpmc26

2
อีกมุมที่ต้องพิจารณาคือแม้ว่าผู้พัฒนาจะสามารถรักษาข้อมูลให้ถูกต้อง (สงสัย) มันจะกลายเป็นทรัพยากรจำนวนมากเพื่อให้แน่ใจว่าทุกฟิลด์ที่ซ้ำกันจะได้รับการปรับปรุงเมื่อจำเป็นเพื่อรักษาความมั่นคง
Nate CK

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

57

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

แต่คุณสามารถสร้างมุมมองหนึ่งครั้งด้วยการเข้าร่วมและใช้งานแทนตารางที่ไม่ปกติ

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


12
มุมมองเป็นเพื่อนของคุณ ใช้พวกเขาอย่างอิสระ และเพื่อประสิทธิภาพคุณยังสามารถใช้มุมมอง Materializedหาก RDBMS ของคุณรองรับ
VH-NZZ

13

คำตอบที่ได้รับการ upvoted ค่อนข้างครอบคลุม "วิธีการหลีกเลี่ยงการทำซ้ำ" (ใช้มุมมอง) แต่ไม่ใช่เหตุผล โดยทั่วไปแล้วพวกเขาแสดงให้เห็นว่าการทำสำเนาคอลัมน์เป็นวิธีแก้ปัญหาที่ไม่ถูกต้องทำให้ง่ายต่อการเขียนแบบสอบถาม แต่คำถาม "ทำไมไม่ทำซ้ำคอลัมน์แบบสุ่มเพียงเพื่อให้ได้ heck" ยังคงยืนอยู่

คำตอบคือ "เพราะกฎของเมอร์ฟี" กฎของเมอร์ฟีระบุว่า:

หากมีสิ่งผิดปกติเกิดขึ้น

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

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


12

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

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

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

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

6

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

วิธีการสืบค้นที่ยากขึ้นเล็กน้อยมีแนวโน้มว่าจะเป็นที่นิยมมากกว่าความเสียหายของข้อมูล


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

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

1
การเล่นทนายของปีศาจที่นี่การโต้เถียงที่ชัดเจนว่าหากมีใครบางคนกำลังทำให้อัปเดตและข้อมูลเสียหายอยู่ดีนั่นเป็นปัญหาที่มีหรือไม่มีการทำให้เป็นมาตรฐาน - และอย่างน้อยการมีความซ้ำซ้อนในฐานข้อมูลทำให้มีแนวโน้มมากขึ้น ว่าใครบางคนจะสังเกตเห็นความเสียหายและอาจสามารถแก้ไขได้ในภายหลัง (แน่นอนว่าการปรับสภาพad hocแทบจะไม่เกิดข้อผิดพลาดที่เชื่อถือได้มากที่สุด แต่หลักการของการตรวจสอบข้อผิดพลาดผ่านระบบสำรองข้อมูลคือเสียง: นั่นเป็นวิธีการทำบัญชีสองรายการ )
Ilmari Karonen

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

0

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

อดทนและทำงานอย่างมีระบบ การเปลี่ยนแปลงจะไม่เกิดขึ้นข้ามคืน


0

เลิก.

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

หรือคุณสามารถประหยัดเวลาและความยุ่งยากและออกจากตอนนี้

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

ดังนั้นคุณจะทำงานได้ดีขึ้นในสถานที่ที่เข้าใจและให้ความสำคัญกับวิศวกรรมที่ดี

โชคดี.


ภายหลัง: บางทีสิ่งที่พวกเขาต้องการคือเครื่องมือ BI / OLAP ... http://en.wikipedia.org/wiki/Online_analytical_processing

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