【问题标题】:yesod persistent postgresql complex recordyesod 持久化 postgresql 复杂记录
【发布时间】:2013-10-12 10:09:46
【问题描述】:

我正在使用持久化保存以下记录(时间为 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 知道如何存储多对多关系吗?

例如给定一个带有列表 :: [B] 的记录 A,我可以用它创建第三个表吗

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

我正在使用以下软件包:

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

【问题讨论】:

  • Persistent 不会尝试管理关系,因此您需要手动定义查找表。如您所见,指定 [Level] 等列表类型会导致整个列表序列化为单个字段。您可以使用BookIdLevelId等标识符来引用其他表的记录。

标签: database haskell orm yesod persistent


【解决方案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 对数组列类型的本机支持。如果您想解决此问题,您需要提交问题或拉取请求。

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多