database haskell orm yesod persistent

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.