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)
)