2013-10-05 13 views
16

Używam trwałych do zapisania następujących rekordów (czas to 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 
    |] 

Kiedy migrować struktury ja dostać stolik rezerwacji:

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

i poziom tabeli:

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

Wkładając książkę, tabela poziom pozostaje pusty i książka tabela zawiera wpis zawierający wersje JSON planowanego rekordu.

Pytania:

Jak mogę uzyskać trwałe w użyciu rzeczywistych typów prostych (np int i czas) dla kolumn zamiast JSON dla złożonych typów?

Czy w sposób trwały umie się przechowywać relacje wiele do wielu?

np. dali Rekord A z listy :: [B], mogę je stworzyć trzecią tabelę z

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

Używam następujące pakiety:

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

Funkcja Persistent nie podejmuje prób zarządzania relacjami, dlatego należy ręcznie zdefiniować tabele odnośników. Określ typy list, takie jak '[Poziom]' powoduje, że cała lista jest serializowana do jednego pola, jak zaobserwowałeś. Możesz używać identyfikatorów takich jak 'BookId' i' LevelId', aby odnieść się do zapisów innych tabel. –

Odpowiedz

1

Po pierwsze, dla [Level], przechowywanie tylko ID pozwala na zapisanie prostego typu na liście 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 
    |] 

Alternatywnie, jeśli trzeba kwerendy całej relacji, trzeba zdefiniować „do” lub tabeli M2M, podobnie jak w normalnym relacyjnych bazach danych.

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

Jak jest w przypadku, o [Volume], problem jest in persistent-postgresql. persistent jest sztywno podłączony do wartości PersistList jako JSON, zamiast korzystania z natywnej obsługi PostgreSQL dla typów kolumn tablicy. Jeśli chcesz to naprawić, musisz przesłać problem lub żądanie pobrania.