TL; DR - พวกเขากำลังออกแบบฐานข้อมูลตามวิธีการที่พวกเขาได้รับการสอนเมื่อพวกเขาอยู่ในโรงเรียน
ฉันน่าจะเขียนคำถามนี้เมื่อ 10 ปีก่อน ฉันใช้เวลาพอสมควรที่จะเข้าใจว่าทำไมรุ่นก่อนของฉันจึงออกแบบฐานข้อมูลในแบบที่พวกเขาทำ คุณกำลังทำงานกับใครบางคนที่:
- ได้รับทักษะการออกแบบฐานข้อมูลส่วนใหญ่โดยใช้ Excel เป็นฐานข้อมูลหรือ
- พวกเขากำลังใช้แนวปฏิบัติที่ดีที่สุดเมื่อพวกเขาออกจากโรงเรียน
ฉันไม่สงสัยว่าเป็นอันดับ 1 เนื่องจากคุณมีหมายเลขประจำตัวในตารางของคุณดังนั้นฉันจะถือว่า # 2
หลังจากที่ฉันออกจากโรงเรียนฉันทำงานให้กับร้านที่ใช้AS / 400 (aka IBM i) ฉันพบสิ่งแปลก ๆ ในวิธีที่พวกเขาออกแบบฐานข้อมูลของพวกเขาและเริ่มสนับสนุนเราทำการเปลี่ยนแปลงตามวิธีที่ฉันสอนวิธีการออกแบบฐานข้อมูล (ตอนนั้นฉันก็โง่แล้ว)
ต้องใช้โปรแกรมเมอร์คนแก่ที่มีอายุมากกว่าที่จะอธิบายให้ฉันฟังว่าทำไมสิ่งต่าง ๆ ถึงถูกทำแบบนั้น พวกเขาไม่ได้เปลี่ยนสคีมาเพราะจะทำให้โปรแกรมที่เก่ากว่าฉันแตก แท้จริงซอร์สโค้ดสำหรับหนึ่งโปรแกรมมีวันที่สร้างของปีก่อนที่ฉันจะเกิด ในระบบที่เรากำลังดำเนินการอยู่โปรแกรมของพวกเขาต้องใช้ตรรกะและการดำเนินการทั้งหมดที่ผู้วางแผนคิวรีของฐานข้อมูลของคุณจัดการให้คุณ (คุณสามารถเห็นได้โดยเรียกใช้อธิบายในแบบสอบถามของคุณ)
เขามีความทันสมัยเกี่ยวกับเทคนิคที่ฉันพยายามนำมาใช้ แต่การทำให้ระบบทำงานได้มีความสำคัญมากกว่าการเปลี่ยนแปลง "เพราะมันขัดกับสิ่งที่ฉันสอน" โครงการใหม่ทุกโครงการของเราเริ่มจากการใช้โมเดลเชิงสัมพันธ์ที่เราสามารถทำได้ดีที่สุด น่าเสียดายที่โปรแกรมเมอร์ / ที่ปรึกษาคนอื่น ๆ ในเวลานั้นยังคงออกแบบฐานข้อมูลของพวกเขาราวกับว่าพวกเขาทำงานกับข้อ จำกัด เดิมของระบบนั้น
ตัวอย่างบางส่วนของสิ่งที่ฉันพบที่ไม่ตรงกับโมเดลเชิงสัมพันธ์:
- วันที่ถูกเก็บเป็นตัวเลขวันจูเลียนซึ่งต้องการการเข้าร่วมในตารางวันที่เพื่อรับวันจริง
- Denormalized tables ที่มีคอลัมน์เรียงตามประเภทเดียวกัน (เช่น
code1,code2, ..., code20
)
- คอลัมน์ CHAR ความยาว NxM แสดงอาร์เรย์ของสตริง N ความยาว M
เหตุผลที่ฉันได้รับจากการตัดสินใจออกแบบนั้นขึ้นอยู่กับข้อ จำกัด ของระบบเมื่อฐานข้อมูลถูกออกแบบครั้งแรก
วันที่ - ฉันได้รับแจ้งว่าต้องใช้เวลาในการประมวลผลมากขึ้นในการใช้ฟังก์ชั่นวันที่ (เดือนหรือวันหรือวันทำงาน) ในการประมวลผลวันที่มากกว่าที่จะสร้างตารางของวันที่ที่เป็นไปได้ทั้งหมดพร้อมข้อมูลทั้งหมด
คอลัมน์เรียงตามลำดับประเภทเดียวกัน - สภาพแวดล้อมการเขียนโปรแกรมที่อนุญาตให้โปรแกรมสร้างตัวแปรอาร์เรย์เหนือส่วนหนึ่งของแถว และเป็นวิธีที่ง่ายกว่าในการลดจำนวนการอ่าน
ความยาว NxM คอลัมน์ CHAR - เป็นการง่ายกว่าที่จะผลักค่าการกำหนดค่าเป็นหนึ่งคอลัมน์เพื่อลดการดำเนินการอ่านไฟล์
ตัวอย่างที่เข้าใจได้ไม่ดีใน C เทียบเท่าเพื่อสะท้อนสภาพแวดล้อมการเขียนโปรแกรมที่พวกเขามี:
#define COURSE_LENGTH 4
#define NUM_COURSES 4
#define PERIOD_LENGTH 2
struct mytable {
int id;
char periodNames[NUM_COURSES * PERIOD_LENGTH]; // NxM CHAR Column
char course1[COURSE_LENGTH];
char course2[COURSE_LENGTH];
char course3[COURSE_LENGTH];
char course4[COURSE_LENGTH];
};
...
// Example row
struct mytable row = {.id= 1, .periodNames="HRP1P2P8", .course1="MATH", .course2="ENGL", .course3 = "SCI ", .course4 = "READ"};
char *courses; // Pointer used to access the sequential columns
courses = (char *)&row.course1;
for(int i = 0; i < NUM_COURSES; i++) {
printf("%d: %.*s -> %.*s\n",i+1, PERIOD_LENGTH, &row.periodNames[PERIOD_LENGTH * i], COURSE_LENGTH,&courses[COURSE_LENGTH*i]);
}
เอาท์พุท
1: HR -> MATH
2: P1 -> ENGL
3: P2 -> SCI
4: P8 -> READ
ตามที่ฉันบอกบางสิ่งนี้ถือว่าเป็นแนวปฏิบัติที่ดีที่สุดในเวลานั้น