データベースは構造体である
これはプログラマなら感覚として認識しているところだと思いますが、より正確な表現をすると、「データベースにおいて表現できるデータ構造とstructにおいて表現できるデータ構造は全く同一である」ということです。この考え方は非常に重要で、プログラムにおけるオブジェクト設計とデータベース設計は非常に似た考え方を持っており、概念としても実装においても、この2つは相互に影響し合う相互依存の関係になっています。
データベースと構造体の関係
データベースにおいてテーブル設計をする際は、プログラムにおいてどのようなstructとして利用するかを意識して設計しておくべきでしょう。例えば、一つのstructに対しては、structと同じ項目をカラムに持った一つのテーブルが対応するような設計となっているべきでしょう。しかし通常、データベースはプログラムのstructよりも先に決定されます。テーブル定義や、DB正規化という考え方は、単にDBの構造について話しているわけではなく、DB正規化によってプログラム内のstructを正規化し、テーブル定義によってプログラムにおけるstructを定義していると考えることができるのです。
また機能的な面ではデータベースは構造体の機能を包含していることを明らかにすることができます。テーブルにはテーブル名とカラム名、カラムのデータ型しかありません。構造体も同じように、構造体名とメンバ変数、メンバ変数のデータ型しかありません。つまりデータベースにおいて表現できるデータ構造とstructにおいて表現できるデータ構造は全く同一なのです。
データベースとEnum
ここで、一つの疑問が浮かびます。structにはenum型が使えますが、データベースにはenum型はありません。やっぱりデータベースとstructは同一ではありませんでした...ちゃんちゃん。
否、ちょっと待ってください。データベースにはforeign key constraint(外部キー制約)という機能があります。データベースのカラムにおいて、enumのように一定の値しか取り得ないという制約は、foreign key constraintによって実現できます。このとき、foreign keyを持つ親テーブルは、それ自体がenumのような役割を持ちます。オブジェクトにおいてenumの値を増やした際には、この親テーブルも同時に変更することで、外部キー制約を保つことができます。