Yesod постоянная postgresql сложная запись

Я использую постоянное сохранение следующих записей (время 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
  |]

Когда я переношу структуры, я получаю таблицу Book:

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 )
 )

и таблица Уровень:

 CREATE TABLE level
 (
   id serial NOT NULL,
   "limit" double precision NOT NULL,
   volumes character varying NOT NULL,
   CONSTRAINT level_pkey PRIMARY KEY (id )
 )

При вставке книги таблица уровней остается пустой, а таблица Book содержит запись, содержащую версии JSON для предполагаемой записи.

Вопросы:

Как я могу настойчиво использовать фактические простые типы (например, int и time) для столбцов вместо JSON для сложных типов?

Неужели Persistent знает, как хранить отношение много-много?

например. учитывая запись A со списком:: [B], могу ли я заставить ее создать третью таблицу с

AId | B
-------
 1  | b1
 1  | b2 etc

Я использую следующие пакеты:

persistent-postgresql-1.0.3
yesod-persistent-1.1.0.1
Postgres 9.1

Ответы

Ответ 1

Во-первых, для [Level] сохранение только идентификатора позволяет хранить простой тип в списке 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
  |]

В качестве альтернативы, если вам нужно запросить отношение, вам нужно определить таблицу "через" или "M2M", как в обычной структуре реляционной базы данных.

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
  |]

Как и в случае [Volume], проблема в persistent-postgresql. persistent жестко привязан к значениям PersistList как JSON, вместо использования встроенной поддержки postgres для типов столбцов массива. Если вы хотите исправить это, вам необходимо отправить запрос или запрос на перенос.