Clojure 如何存储动态属性 (不定字段) 的数据

sectic · 2014年07月04日 · 最后由 xmonkeycn 回复于 2014年07月05日 · 10947 次阅读

lz 用过 bento 和 mystuff2,这种可以去自己添加字段的数据库类似产品是怎么实现的。 今天晚上想了一晚上,感觉用关系型数据库很难去做这件事,hashmap 做这个事情倒是很方便,但是持久化和搜索都要花点功夫。 各位有何高见。 以前也想过类似的问题,在 omnifous 里面可以做到无限层级,数据库很难很难,事后证明 Omnigroup 是用 xml 来做这件事情的。

  1. 如果事务要求不高,用 nosql 数据库,比如:MongoDB
  2. 用 Postgresql 数据库的 Json 字段,或 9.4 版的 jsonb 字段
  3. 如果只是一层,可以参考:https://ruby-china.org/topics/20295 贴子的三楼

@winnie 一层就用 PostgreSQL 的 hstore, 比 json 字段效率更高。

就算是用 MySQL 或者 sqlite3, 也可以用一个文本字段来做 Hash 或者 Array,然后 ActiveRecord.serialize,只是查询比较麻烦,取值速度稍慢,基本功能没什么问题。

@billy 不错,不过效率更高的是 jsonb

PostgreSQL 9.4 将于第三季度发布,该版本最大特色是新增:JSONB 类型,即二进制json格式。
用json替代可变表内容属性(比如不同商品的不同特定属性:颜色,重量等)将成为一种可能,这也是文档型数据库我最喜欢的一点。
JSONB的查询性能已经快于MongoDB,惊讶不?
https://plus.google.com/+ThomBrownUK/posts/1JizRBGPYBq
http://www.reddit.com/r/programming/comments/1q3skb/postgresql_94_is_now_faster_than_mongodb_for/

@winnie 你说的是和 MongoDB 的对比。hstore 是 PostgreSQL 本身内置的插件,比 JSONB 出来更早,只适用单层。如果是单层字段,当然是用单层的算法快了。

@billy 对,我比较错对象了,JSONB 融合了 JSON 和 HSTORE 两者的优点,也许要实际测试一下才能有结果。

用关系型数据库可以用 2 楼提到的文本存 Hash,但搜索起来就麻烦了。 参考 railscast: http://railscasts.com/episodes/403-dynamic-forms https://github.com/railscasts/403-dynamic-forms

或者就用 pg 的扩展功能 hstore 或者 JSONB

8 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号