我正在使用 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 和时间)而不是对复杂类型使用 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
最佳答案
首先,对于 [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 对数组列类型的 native 支持。如果您想解决这个问题,您需要提交问题或拉取请求。
关于database - yesod持久化postgresql复杂记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19197682/