haskell-jp / questions #98 at 2021-08-03 18:33:27 +0900

上の質問の直和型をデータベースに保存する話ですが、返答いただいた方法と別の方法(私がやりたかった方法)を見つけたので、Qiitaで記事にしてみました。
この方法ならHaskell上で自然に直和型が扱えると思います。
ぜひ、ご意見などいただけると幸いです。
https://qiita.com/nekonibox/items/297c1d2d44b273be2571
この方法であれば、昨今のRDBならおおむねどこも提供しているJSON型を使った方がより使いやすいかと。メリットデメリットもJSON型のものがそのまま当てはまりそうです。
直和型をデータベースに保存する方法っていうか、Haskellのデータを直列化してデータベースに保存する方法ですね……
なるほど、ご意見ありがとうございます。

うーん、とは言ってもリスト、直積、Set、Vectorも全部同じようにStringとして保存しているので直和があってもとは思ったのですが...
見た目の上では直接保存しているように見えることを重視した感じです。
理想的には、実際のデータベースとのやりとりを知らなくても、メインプログラムを記述する上では特別な型を作らないで、あたかもHaskellで普段使う型のまま完結してほしい感じですかね。
まじっすか... :cold_sweat: それは、直積であれなんであれRDBでやる以上極力やらない方がいいですね...。割り切った上でやるにしてもまだJSON型の方がマシです(多分、persistentが出た当時JSON型が出てなかったか普及してなかったんでしょうけど)。文字列に変換された列はとても検索しづらくなるので用途が絞られる。
persistent はあんまり凝ったクエリーが書けなかった気がするので persistent 経由でしか RDB を触らないならいい気がします
(persistent で PersistList ってどう保存されるんでしたっけ
しかし、直和型以外の複合型(レコードとかリストとか)に対してそこまで大胆な設計をしているのになんで直和型だけ?という気持ちには確かになりますね。
persistentっていう名前の印象からして、RDB的なものというよりデータの永続化を主目的としてる感じがするんですが、どうなんでしょう(あまり調べないで言ってる)
えぇ、そこはその通りで、MongoDBのバックエンドもあるくらいですから。MongoDBならリストなりレコードなりを直接保存するのはよくわかります。それとの一貫性という意味でRDBでも文字列に変換して保存する機能を提供しているんでしょう。その上でやっぱりじゃあなんで直和型だけ...?という気がします :confused: