Как сделать магазин алгебраический тип данных в постоянном
-
23-12-2019 - |
Вопрос
для типа данных, как так
data Tree = Node String Tree Tree
| Leaf String
.
и реальные данные, как так
my_tree = (Node "first node" (Leaf "leaf") (Node "second node" (Leaf "leaf") (Leaf "leaf")))
.
Как хранить это в базе данных, используя постоянную, конкретно, как сделать «или» часть?
Я пытался определить модель, как так
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Tree
value String
leftTree Leaf
rightTree Leaf
deriving Show
Leaf
value String
deriving Show
|]
.
Рекурсивная структура будет храниться в столбце подряд в виде строки JSON автоматически, которая очень хорошая.Но как мы или можем определить «или» структуру в постоянной модели?
Решение
Персональный может хранить только рекламу, которые не имеют детских данных.ЯСледующее может быть сохранено:
data Tag = Leaf | Fork
.
Но рекурсивные структуры, такие как это, нельзя хранить без сериала, чтобы json:
data Tree a = (Leaf a) | Fork (Tree a) (Tree a)
.
Что вы должны понять, это то, что настойчивый - это настойчивый слой для экономии типа в верхней части базы данных, поэтому вы должны думать о вашей схеме с точки зрения того, что эффективно хранить в базе данных, не с точки зрения того, что удобноDatastructure Haskell.
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Tree
parent TreeId Maybe
value String
deriving Show
|]
.
Эта схема даст вам эквивалент следующей структуры.
data Tree a = Value a [Tree a]
.