TL; DR은 - 그들은 방법에 따라 데이터베이스를 설계하고 그들은 그들이 학교에있을 때 배웠다.
나는 10 년 전에이 질문을 쓸 수있었습니다. 이전 모델이 데이터베이스를 설계 한 방식을 이해하는 데 시간이 걸렸습니다. 다음 중 하나를 수행하는 사람과 협력하고 있습니다.
- Excel을 데이터베이스로 사용하거나 대부분의 데이터베이스 설계 기술을 습득했습니다.
- 그들은 학교에서 나왔을 때 모범 사례를 사용하고 있습니다.
실제로 테이블에 ID 번호가 있으므로 # 1이라고 의심하지 않으므로 # 2로 가정합니다.
학교를 졸업 한 후 AS / 400 (일명 IBM i) 을 사용하는 상점에서 일하고있었습니다 . 데이터베이스를 설계하는 방식에서 이상한 점을 발견하고 데이터베이스 설계 방법을 배운 방식을 따르도록 옹호하기 시작했습니다. (나는 그때 바보 였어)
왜 그런 식으로 일을했는지 나에게 설명하기 위해 환자 나이 많은 프로그래머가 필요했습니다. 그들은 나보다 오래된 프로그램을 중단시킬 수 있었기 때문에 스키마를 변경하지 않았습니다. 말 그대로, 한 프로그램의 소스 코드는 내가 태어나 기 전 해의 작성 날짜를 가졌습니다. 우리가 작업하고 있던 시스템에서 그들의 프로그램 은 데이터베이스의 쿼리 플래너가 처리하는 모든 논리와 작업을 구현해야했습니다. (쿼리 중 하나에서 EXPLAIN을 실행하면 알 수 있습니다)
그는 내가 구현하려는 기술에 대해 최신 정보를 얻었지만 "내가 가르치는 것과 상반되기 때문에"변경하는 것보다 시스템을 계속 실행하는 것이 더 중요했습니다. 우리 모두의 모든 새로운 프로젝트는 우리가 할 수있는 관계형 모델을 최대한 활용하기 시작했습니다. 불행히도 당시의 다른 프로그래머 / 컨설턴트는 여전히 해당 시스템의 이전 제약 조건으로 작업하는 것처럼 데이터베이스를 설계했습니다.
내가 만난 것에 대한 몇 가지 예는 관계형 모델에 맞지 않습니다.
- 날짜는 Julian 날짜 번호 로 저장되었으며 실제 날짜를 얻으려면 날짜 테이블에 조인해야했습니다.
- 동일한 유형의 연속 열 비정규 테이블 (예를 들어
code1,code2, ..., code20
)
- 길이 M의 N 문자열 배열을 나타내는 NxM 길이 CHAR 열
제가 이러한 디자인 결정을 한 이유는 데이터베이스를 처음 디자인 할 때 시스템의 제약 조건을 바탕으로 한 것입니다.
날짜 -날짜 정보 (월 또는 일 또는 주중)를 사용하여 날짜를 처리하는 데 모든 정보가 포함 된 가능한 모든 날짜의 테이블을 만드는 것보다 처리 시간이 더 걸린다고 들었습니다.
동일한 유형의 순차 열 -프로그램 환경에서 프로그램이 행의 일부에 대해 배열 변수를 작성할 수 있습니다. 그리고 읽기 작업 수를 줄이는 더 쉬운 방법이었습니다.
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-> 수학
2 : P1-> ENGL
3 : P2- > SCI
4 : P8-> 읽기
내가 들었던 것에 따르면,이 중 일부는 당시 모범 사례로 간주되었습니다.