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