在我的项目中,我实际上有包含json(嵌套)数据列的表,但它们不是JSON数据类型。对于一些json属性,我在同一个表中有一个列,这样我在搜索,排序等时可以有一些性能。就像使用关系数据一样。为了更好地理解,这里有一个我实际拥有的例子:
lb_reg_marcacao_especial
Column | Type | Modifiers
----------------------+-----------------------------+-----------
id | integer | not null
json | character varying | not null
nm_marcacao | character varying |
dt_inclusao | timestamp without time zone |
Indexes:
"lb_reg_marcacao_especial_pkey" PRIMARY KEY, btree (id_reg)
"lb_reg_marcacao_especial_nm_marcacao_key" UNIQUE CONSTRAINT, btree (nm_marcacao)
而json列的数据如下:
'{
"dt_inclusao": "02/12/2013 11:05:27",
"nm_user_inclusao": "Some name",
"nested": {
"nm_marcacao": "marc1",
"dt_ultima_alteracao": ""
},
"nm_user_ultima_alteracao": "",
"ds_marcacao": "marc1",
"st_marcacao": true
}'
其中一些json数据有~100个键和大约3个嵌套级别。如您所见,数据被复制,因为我在json和表的列中有一些键(nm_marcacao和dt_inclusao)。
所以,我正在考虑将json列数据类型更改为JSON并删除其他列。你呢?
答案 0 :(得分:1)
切换到JSON而不是文本有几个好处:
1)将验证数据以确认实际的JSON规范。您的服务器端应用程序可能已经这样做,但类型安全总是很好。
2)您可以访问多个JSON函数,例如任意路径的属性getter,转换为记录等等:
http://www.postgresql.org/docs/9.3/static/functions-json.html http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/
要做setter,我建议一个简单的plv8函数,它接受3个输入(json对象,path-to-property,updated-value)并返回更新的json对象。这可以直接在更新语句中使用。
3)您实际上可以为性能索引JSON的某些属性:
How to create index on json field in Postgres 9.3
4)JSON 9.4将引入二进制存储,并且索引引擎的改进将大大提高速度:
http://obartunov.livejournal.com/177247.html
以下是关于9.3中JSON状态的精彩演讲:
http://www.slideshare.net/amdunstan/93json-26647827
以下是早期版本(使用原始hstore2工作)的性能报告,显示了相对于mongodb的一些性能 - 这是由jsonb作者提供的:
http://obartunov.livejournal.com/175235.html
以及来自其他人的更新基准: