TL; DR-学校にいたときに教えられた方法に基づいてデータベースを設計しています。
10年前にこの質問を書いたかもしれません。私の前任者がなぜ彼らのデータベースを彼らのやり方で設計したのかを理解するのに時間がかかりました。次のいずれかで作業している:
- Excelをデータベースとして使用して、ほとんどのデータベース設計スキルを獲得したか、
- 彼らは学校を卒業したときからのベストプラクティスを使用しています。
テーブルに実際にID番号があるため、#1であるとは思わないので、#2と仮定します。
学校を卒業した後、AS / 400(別名IBM i)を使用する店で働いていました。私は彼らがデータベースを設計する方法に奇妙なことを発見し、データベースの設計方法を教えられた方法に従うために変更を行うことを主張し始めました。(当時はバカだった)
忍耐強い年上のプログラマーに、なぜ物事がそのように行われたのかを説明するのに時間がかかりました。私よりも古いプログラムが壊れる可能性があるため、彼らはスキーマを変更していませんでした。文字通り、あるプログラムのソースコードには、私が生まれる前の年の作成日がありました。作業中のシステムでは、データベースのクエリプランナーが処理するすべてのロジックと操作をプログラムで実装する必要がありました。(クエリの1つでEXPLAINを実行すると確認できます)
彼は私が実装しようとしていた技術については最新でしたが、「教えられたことに反して」変更を加えるよりもシステムを実行し続けることの方が重要でした。私たちのどちらかが始めたすべての新しいプロジェクトは、私たちができるリレーショナルモデルを最大限に活用しました。残念ながら、当時の他のプログラマ/コンサルタントは、そのシステムの以前の制約で作業しているかのようにデータベースを設計していました。
リレーショナルモデルに適合しなかった、私が遭遇したいくつかの例:
- 日付はユリウス日として保存され、実際の日付を取得するには日付テーブルへの結合が必要でした。
- 同じタイプの連続した列を持つ非正規化テーブル(例
code1,code2, ..., code20
)
- 長さMのN個の文字列の配列を表すNxM長のCHAR列。
これらの設計決定のために私に与えられた理由はすべて、データベースが最初に設計されたときのシステムの制約に基づいていました。
日付 - 日付を処理するために日付関数(月、日、曜日)を使用すると、すべての情報を含む可能なすべての日付のテーブルを作成するよりも処理時間がかかると言われました。
同じタイプの連続列 -プログラミング環境では、プログラムが行の一部に配列変数を作成できました。また、読み取り操作の数を減らす簡単な方法でした。
NxMの長さのCHAR列 -ファイルの読み取り操作を減らすために、構成値を1つの列に押し込む方が簡単でした。
彼らが持っていたプログラミング環境を反映するために、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->読み取り
私が言われたように、これのいくつかは当時ベストプラクティスと考えられていました。