对于像这样的数据类型
data Tree = Node String Tree Tree
| Leaf String
真实数据如此
my_tree = (Node "first node" (Leaf "leaf") (Node "second node" (Leaf "leaf") (Leaf "leaf")))
如何使用持久性将其存储到数据库中,具体如何进行“OR”部分?
我尝试过像这样定义模型
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Tree
value String
leftTree Leaf
rightTree Leaf
deriving Show
Leaf
value String
deriving Show
|]
递归结构将作为json字符串自动存储在一行中的列中,这非常好。但是我们如何或者可以在持久模型中定义“OR”结构?
答案 0 :(得分:9)
持久性只能存储没有子数据的ADT。 I.E.可以存储以下内容:
data Tag = Leaf | Fork
但是如果不将它序列化为JSON,则无法存储这样的递归结构:
data Tree a = (Leaf a) | Fork (Tree a) (Tree a)
你必须要了解的是Persistent是数据库顶部的类型保存层,所以你必须根据存储在数据库中的效率来考虑你的模式,而不是方便的方面。 Haskell数据结构。
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Tree
parent TreeId Maybe
value String
deriving Show
|]
此架构将为您提供以下结构的等效内容。
data Tree a = Value a [Tree a]