database - Yesod persistente postgresql complejo registro
haskell orm (1)
Estoy usando persistente para guardar los siguientes registros (Time is UTCTime).
type Price = Int
type Volume = Int
share [mkPersist sqlSettings, mkMigrate "migrateBook"]
[persistLowerCase|
Level
limit Price
volumes [Volume]
deriving Show Read Eq
Book
time Time
asks [Level]
bids [Level]
deriving Show Read Eq
|]
Cuando migro las estructuras obtengo una tabla de Libro:
CREATE TABLE book
(
id serial NOT NULL,
"time" timestamp without time zone NOT NULL,
asks character varying NOT NULL,
bids character varying NOT NULL,
CONSTRAINT book_pkey PRIMARY KEY (id )
)
y un nivel de mesa:
CREATE TABLE level
(
id serial NOT NULL,
"limit" double precision NOT NULL,
volumes character varying NOT NULL,
CONSTRAINT level_pkey PRIMARY KEY (id )
)
Al insertar un libro, la tabla de niveles permanece vacía y la tabla de libros contiene una entrada que contiene las versiones JSON del registro deseado.
Preguntas:
¿Cómo puedo ser persistente para usar los tipos simples reales (por ejemplo, int y time) para las columnas en lugar de JSON para los tipos complejos?
¿Persistent sabe cómo almacenar una relación de muchos a muchos?
por ejemplo, dado un registro A con una lista :: [B], ¿puedo hacer que cree una tercera tabla con
AId | B
-------
1 | b1
1 | b2 etc
Estoy usando los siguientes paquetes:
persistent-postgresql-1.0.3
yesod-persistent-1.1.0.1
Postgres 9.1
En primer lugar, para [Level]
, almacenar solo la ID le permite almacenar un tipo simple en una lista json.
type Price = Int
type Volume = Int
share [mkPersist sqlSettings, mkMigrate "migrateBook"]
[persistLowerCase|
Level
limit Price
volumes [Volume]
deriving Show Read Eq
Book
time Time
asks [LevelId]
bids [LevelId]
deriving Show Read Eq
|]
Alternativamente, si necesita consultar a través de la relación, debe definir una tabla "a través de" o M2M, como en un diseño de base de datos relacional normal.
type Price = Int
type Volume = Int
share [mkPersist sqlSettings, mkMigrate "migrateBook"]
[persistLowerCase|
Level
limit Price
volumes [Volume]
deriving Show Read Eq
Book
time Time
deriving Show Read Eq
BookAsk
book BookId
level LevelId
BookBid
book BookId
level LevelId
|]
Como es el caso de, para [Volume]
, el problema está en persistent-postgresql . persistente está cableado para PersistList
valores de PersistList
como JSON, en lugar de usar el soporte nativo de postgres para los tipos de columna de matriz. Si desea solucionar este problema, deberá enviar un problema o una solicitud de extracción.