TL;DR

  • 関数型プログラミングのモデルはデータと振る舞いが分かれているので、RDB と相性が良い。
  • テーブルをレコード型に直接マッピングする。ただし、プリミティブな値しか保存できない点と、選択型を表せない点でミスマッチが起きる。

内容

リレーショナルデータベースを扱う の一節である。

関数型のモデルは、データと振る舞いが混在しない。そのため、レコードの保存や取得がオブジェクト指向よりも直接的になり、リレーショナルデータベースとの相性が良い。そこで、第11章 Serialization にならって、テーブルをレコード型に直接マッピングする戦略を取る。

この戦略には次のメリットがある。RDB のテーブルは、レコードのコレクションに対応する。また、SELECT や WHERE のような集合指向の操作は、map や filter のようなリスト指向の操作に似ている。

一方で、次のミスマッチも起きる。

  • RDB にはプリミティブな値しか保存できない
  • 選択型にはそのまま対応できない

例

次のドメインモデルを考える。

type CustomerId = CustomerId of int
type String50 = String50 of string
type Birthdate = Birthdate of DateTime
 
type Customer =
    { CustomerId: CustomerId
      Name: String50
      Birthdate: Birthdate }

これに対応するテーブルは次のようになる。

CREATE TABLE Customer (
    CustomerId int NOT NULL,
    Name NVARCHAR(50) NOT NULL,
    Birthdate DATETIME NULL,
    CONSTRAINT PK_Customer PRIMARY KEY (CustomerId)
)

キーワード