2013-10-05 2 views
16

Я использую постоянное сохранение следующих записей (время UTCTime).yesod persistent postgresql complex record

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

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

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 и время) для столбцов вместо JSON для сложных типов?

Неустанно знать, как хранить отношение многих ко многим?

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

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

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

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

Постоянный не пытается управлять отношениями, поэтому вам нужно будет определять таблицы поиска вручную. Укажите типы списков, такие как '[Level]', чтобы весь список был сериализован в одно поле, как вы заметили. Вы можете использовать идентификаторы, такие как 'BookId' и' LevelId', чтобы ссылаться на записи других таблиц. –

ответ

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

Смежные вопросы