การจัดโครงสร้างใหม่หรืออัพเกรดฐานข้อมูลเพื่อจัดการกับคุณสมบัติใหม่


9

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

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

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


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

คำตอบ:


3

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

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฐานข้อมูล refactoring ที่นี่


เว็บไซต์นี้เป็นสิ่งที่ถามคำถามในสถานที่แรก;)
JeffO

14

รหัสการเปลี่ยนโครงสร้างนั้นง่าย - คุณเพียงแค่เปลี่ยนรหัสและทำการทดสอบการถดถอยของคุณ

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

สิ่งที่น่ากลัว


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

8
+1 สำหรับ @Mathew Flynn คุณจะสะสมข้อมูลเท่าไรก่อนที่จะตระหนักถึงความต้องการนี้ ล้านแถว ปัญหาอีกประการคือแอพของคุณไม่ได้ใช้ฐานข้อมูล ฐานข้อมูลอาจมีแอพพลิเคชั่นมากมายที่ทำงานกับมันและคุณอาจไม่รู้ด้วยซ้ำว่ามีอยู่ (เช่นแอป "BI" ที่เป็นป่า) การเปลี่ยนแปลงใน schemas ฐานข้อมูลมีความน่ากลัว
แองเจโล

2
บางครั้งพันล้านแถว
HLGEM

1
หากคุณกำลังติดต่อกับหลายพันล้านแถวคุณจะรู้วิธีเคลื่อนย้ายพวกเขาได้ดีขึ้น
JeffO

3

มีเส้นแบ่งระหว่างการใช้เวลามากกับการพัฒนาด้านวิศวกรรมและการใช้เวลาเล็กน้อยในการเพิ่มคุณสมบัติที่เพียงพอเพื่อให้คุณประหยัดเวลาได้มากในอนาคต


1
คุณสามารถทำการโต้แย้งนี้สำหรับอินสแตนซ์ที่แยกได้หรือสองอย่าง แต่เมื่อ 'บิต' ของเวลาเพิ่มขึ้นมากเกินไป?
JeffO

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

@Jeff O: มันจะไม่เป็น 'บิต' การลงทุน 10% หรือ 20% ของเวลาในการพัฒนาในการชุบแข็งนั้นเป็นสิ่งจำเป็นเนื่องจากระบบอาจอยู่ได้นานกว่าทั้งระยะเวลาที่คาดการณ์ไว้และการจ้างงานของคุณ
rwong

3

ฉันคิดว่าทฤษฏีคือถ้าคุณรวมตารางการเชื่อมโยงเพื่อสนับสนุนความสัมพันธ์แบบหลายต่อหลายอย่างระหว่าง 2 ตารางแม้ว่าจริงๆแล้วมีเพียงความสัมพันธ์แบบหนึ่งต่อหนึ่งที่มีอยู่ในข้อมูลทุกคนจะเขียน SQL ด้วยวิธีนี้ หลายต่อหลายคนได้รับการสนับสนุนทุกอย่างจะ "ทำงาน"

ในทางปฏิบัติฉันไม่เคยพบว่ามันเป็นเรื่องจริง แต่ฉันคิดว่า SQL นั้นใกล้เคียงกับสิ่งที่มันต้องการเพื่อสนับสนุนหลาย ๆ อย่างมากกว่าที่มันจะเป็นเช่นนั้น

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

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

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

ในระหว่างนี้คุณสามารถปรับโครงสร้างได้ตั้งแต่ 1 ถึงมากไปจนถึงหลายต่อหลาย แต่ก็สามารถทำงานได้มาก


คุณจะไม่เปลี่ยนความสัมพันธ์ทุกอย่างให้มากขึ้นหรือไม่
JeffO

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

3

ฉันมักจะอธิบายวิธีนี้ไปยัง PHBs - รหัสคือผนังและหลังคาฐานข้อมูลเป็นรากฐาน

การเคลื่อนย้ายผนังและการเปลี่ยนหลังคาสามารถทำได้ การเปลี่ยนฐานรากต้องใช้การขุดและสร้างกำแพงและหลังคาใหม่

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

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


1

กฎทั่วไปคือถ้าความสัมพันธ์เป็นแบบหนึ่งต่อหนึ่ง แต่ในอนาคตอาจเป็นจำนวนมากต่อหลาย ๆ คนจากนั้นทำให้เป็นจำนวนมากไปเป็นจำนวนมาก

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

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


ฉันเห็นด้วยมีหลายโดเมนที่ครบกำหนด (เช่น HR) ที่ลูกค้าไม่คาดหวังความต้องการ แต่คุณรู้ว่ามันต้องเกิดขึ้น
JeffO

0

มีสองวิธีในการดูการออกแบบซอฟต์แวร์ (และสิ่งอื่น ๆ อีกมากมาย) - มุมมองทางยุทธวิธีหรือมุมมองเชิงกลยุทธ์ แต่ละคนมีข้อดีและข้อเสียของตัวเอง

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

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

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

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

ดังนั้นจึงเป็นการดีกว่าที่จะคาดการณ์สิ่งนี้ตั้งแต่เริ่มต้น


ทุกอย่างดีกว่าที่คาดการณ์ไว้ตั้งแต่เริ่มต้น
JeffO

0

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

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