16

次のレコードを保存するために永続的に使用しています (時間は 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 バージョンを含むエントリが含まれます。

質問:

複雑な型の JSON ではなく、実際の単純な型 (int や time など) を列に使用するように永続化するにはどうすればよいですか?

Persistent は多対多の関係を保存する方法を知っていますか?

たとえば、リスト :: [B] を持つレコード A が与えられた場合、次のように 3 番目のテーブルを作成することができますか?

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

次のパッケージを使用しています。

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

1 に答える 1

1

まず、 の場合[Level]、ID だけを格納すると、単純な型を 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
  |]

for の場合と同様に[Volume]、問題はpersistent-postgresql にあります。PersistListpersist は、postgres の配列列型のネイティブ サポートを使用する代わりに、値を JSON としてマーシャリングするように組み込まれています。これを修正したい場合は、Issue またはプル リクエストを送信する必要があります。

于 2014-01-20T08:21:57.820 に答える