yesod持久postgresql复杂记录

时间:2013-10-05 12:15:31

标签: database haskell orm yesod persistent

我使用persistent来保存以下记录(时间是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是否知道如何存储多对多的关系?

e.g。如果给出一个带有list :: [B]的记录A,我是否可以使用

创建第三个表
AId | B
-------
 1  | b1
 1  | b2 etc

我正在使用以下套餐:

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

1 个答案:

答案 0 :(得分: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
  |]

[Volume]而言,问题是in persistent-postgresql。 persistent通过硬连线将PersistList值作为JSON进行编组,而不是使用postgres对数组列类型的本机支持。如果您想解决此问题,则需要提交问题或提取请求。