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

При вставке книги таблица уровней остается пустой, а таблица книг содержит запись, содержащую версии 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

person Maarten    schedule 05.10.2013    source источник
comment
Persistent не пытается управлять отношениями, поэтому вам нужно будет определить таблицы поиска вручную. Указание типов списков, таких как [Level], приводит к тому, что весь список сериализуется в одно поле, как вы заметили. Вы можете использовать такие идентификаторы, как BookId и LevelId, для ссылки на записи других таблиц.   -  person Michael Steele    schedule 18.12.2013


Ответы (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], проблема заключается в в файле persistence-postgresql. постоянная жестко зашита для маршалирования значений PersistList как JSON вместо использования встроенной поддержки postgres для типов столбцов массива. Если вы хотите исправить это, вам нужно отправить вопрос или запрос на вытягивание.

person Thomas    schedule 20.01.2014