วิธีการดำน้ำในฐานข้อมูลที่น่าเกลียด?


26

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

คำถามของฉันคือคุณจะจัดการกับมันอย่างไร?

  • คุณพยายามสร้างฐานข้อมูลใหม่หรือไม่?
  • คุณยอมแพ้และปล่อยให้มันอยู่คนเดียว?
  • คุณให้คำแนะนำอะไรได้บ้าง

คำตอบ:


29
  • สิ่งแรกที่ฉันทำคือสร้างแผนภาพความสัมพันธ์เอนทิตี (ERD) บางครั้งคุณสามารถอธิบายข้อมูลเมตาด้วยเครื่องมือบรรทัดคำสั่ง แต่เพื่อประหยัดเวลามีเครื่องมือบางอย่างที่สามารถสร้างไดอะแกรมโดยอัตโนมัติ

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

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

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

  • ประการที่ห้าอ่านกระบวนการใด ๆ ที่เก็บไว้ นอกจากนี้อ่านสิทธิ์การเข้าถึง SQL หากมีเช่นนั้น

  • หกอ่านส่วนต่าง ๆ ของรหัสแอปพลิเคชันที่ใช้ฐานข้อมูล นั่นคือสิ่งที่มีการบังคับใช้กฎธุรกิจเพิ่มเติมและกฎความสมบูรณ์ของข้อมูล


update: ฉันเพิ่งอ่านบทความที่น่าสนใจ " 9 สิ่งที่ต้องทำเมื่อคุณรับฐานข้อมูล " ด้วยรายการตรวจสอบที่ดี

สรุป:

  1. การสำรองข้อมูล
  2. การวิจัย (ขั้นตอนเอกสารประกอบคีมาที่ฉันพูดถึงข้างต้น)
  3. พูดคุยกับนักพัฒนาในอดีต
  4. ฐานข้อมูลบั๊ก
  5. การควบคุมรหัสที่มา
  6. พูดคุยกับผู้ใช้และ / หรือเจ้าของธุรกิจ
  7. สร้างความน่าเชื่อถือกับผู้ใช้โดยการแก้ไขบางสิ่งหรือทำการปรับปรุงบางอย่าง
  8. สร้างสภาพแวดล้อมการพัฒนา
  9. วางวัตถุที่ล้าสมัย

13

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


ใน Oracle Materialized Views ยังสามารถช่วยในเรื่องนี้
Leigh Riffel

9

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

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

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


6

นอกเหนือจากความคิดของ Bill Karwin ฉันขอแนะนำให้พูดคุยกับผู้ใช้ - ผู้ใช้บางครั้งรู้ค่อนข้างน้อยเกี่ยวกับฐานข้อมูลของพวกเขาที่ใช้สำหรับโดยเฉพาะอย่างยิ่งถ้าพวกเขาทำรายงานใด ๆ จากมัน


6

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

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

--Find Column named like 'blah' in a specific table
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V') AND O.Name like '%TableName%'
ORDER by O.Name

หรือ

--Find all Columns in DB with name like 'blah'    
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V')
ORDER by O.Name

เนื่องจากบางตารางมีคอลัมน์ที่มีชื่อไม่ดีมากเกินไปและมีคอลัมน์มากเกินกว่าที่จะมองผ่านเพื่อค้นหาสิ่งที่ฉันอาจใช้เพื่อสร้างความสัมพันธ์ระหว่างตาราง

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


6

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

SchemaCrawler ยัง infers ความสัมพันธ์ที่สำคัญต่างประเทศแม้ในกรณีที่ไม่มีกุญแจต่างประเทศ ทำได้โดยการค้นหา "การเชื่อมโยงที่อ่อนแอ" โดยใช้หลักการตั้งชื่อทั่วไปเช่นตารางเป็นชื่อมักจะเป็นชื่อพหูพจน์ แต่ชื่อคอลัมน์ไม่ได้และชื่อคอลัมน์อาจมีส่วนนำหน้าเป็น _ID คุณสามารถค้นหาตารางที่เกี่ยวข้องได้โดยใช้ความสัมพันธ์ที่อนุมานเหล่านี้


5

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

ข้อมูลพนักงาน

มีฐานข้อมูลที่เก็บข้อมูลพนักงาน มันเป็นฐานข้อมูลผู้ขายดังนั้นฉันจึงไม่สามารถควบคุมมันได้ (Un?) โชคดีที่ฉันไม่สามารถเข้าถึงได้โดยตรง ฉันได้รับการถ่ายโอนข้อมูล DTS ทุกเช้า

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

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

ข้อมูลการฝึกอบรมออนไลน์

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

มันเป็นกระบวนการที่ยาวนาน แต่มันก็เข้ากันได้ดี

ข้อมูลการฝึกอบรมในชั้นเรียน

โครงการนำร่องของฉันได้รวมข้อมูลจากฐานข้อมูล 3 แบบต่างกันทั้งหมดได้รับการออกแบบแตกต่างกันเล็กน้อยโดยรุ่นก่อนของฉัน ...

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

เมื่อมองย้อนกลับไปสิ่งนี้จะเป็นตัวเต็งที่จะเริ่มต้นทำความสะอาด ... สายตาหลังอยู่ตลอด 20/20

ในที่สุด ...

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


5

ดังนั้นหลังจากอ่านคำตอบทั้งหมดของคุณแล้ว

ก่อนอื่นฉันมองหา "ตารางหลัก" จากนั้นด้วยปากกาและกระดาษฉันเริ่มทำแผนที่ความสัมพันธ์กับตารางอื่น ๆ หลังจากนั้นถ้ามีรหัสแอพที่จะดูฉันเริ่มสร้างภาพร่างดิบเกี่ยวกับการไหลของข้อมูล

หลังจากฉันได้ภาพที่ดีเกี่ยวกับวิธีการทำงานของ db ฉันเพิ่งเริ่มตรวจสอบสถานที่ที่จะเปลี่ยนแปลงสิ่งต่าง ๆ แค่นั้นแหละ.

ฉันไม่รู้ว่าทำไม แต่ฉันชอบกระดาษมากกว่าซอฟต์แวร์สร้างแบบจำลองฐานข้อมูลใด ๆ


5

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

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

มุมมองขั้นตอนการจัดเก็บจะซ่อนการแก้ไขฐานข้อมูลภายใน (การเปลี่ยนแปลง)


4

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


4

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


4

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


4

หากคุณมี Visio (ส่วนหนึ่งของ Microsoft Office) คุณสามารถลองใช้ฟังก์ชั่นวิศวกรรมย้อนกลับได้ มันไม่ได้สวย แต่อย่างน้อยมันก็จะทำให้คุณเริ่มต้น (โดยใช้เศษเสี้ยวของเครื่องมือ "ของจริง" อย่าง Rational Rose)



3

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

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


3

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

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

จากประสบการณ์ของฉันในการสร้างฐานข้อมูลใหม่ไม่ใช่ตัวเลือกจริงๆเนื่องจากการย้ายข้อมูลหลายร้อย GB หรือ TBs ไม่ใช่สิ่งที่เป็นไปได้ทั้งหมด

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


3

อ่า ... ฐานข้อมูลน่าเกลียดองค์กรขนาดใหญ่ก็คือฐานข้อมูลดั้งเดิมที่เราจะพบ

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

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

ขอให้โชคดีกับเพื่อนสาวน่าเกลียดของคุณ;)


2

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

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

นอกจากนี้ (ถูกขโมยจาก NXC) คุณสามารถทำวิศวกรรมฐานข้อมูลกลับด้วยเครื่องมือเช่น Visio


2

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


1

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

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

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