回答

收藏

在ActiveRecord中存储序列化哈希与键/值数据库对象的优缺点?

技术问答 技术问答 187 人阅读 | 0 人回复 | 2023-09-14

如果我有几个对象,每个对象基本上都有一个Profile,我正在使用什么来存储随机属性,那么它们的优缺点是什么:/ a2 {8 u! w5 `) n" A, h
[ol]将序列化的散列存储在列中以进行记录,而不是
' |& T5 J  @5 {0 s6 @# n( a存储一堆belong_to主要对象的键/值对象。/ D" t9 D2 H6 ~# u6 M
[/ol]
/ e0 C7 H) ~' H/ s) f代码
8 C# N5 @9 x8 y, d# h0 y假设您有类似以下的STI记录:- v+ @! J% R' C" q
class Building  :profilable
5 o) u0 ^+ y& y- M+ q, Q4 mend
; j+ s& J! D- gclass OfficeBuilding 每个 has_one :profile
. |* N2 h# c8 x选项1。序列化哈希% k5 R* X% k' A+ ~, w& }
class SerializedProfile  true do |t|
+ U8 W9 E6 a* o  f  t.string   :name
+ w9 u. p5 Z. g& y  v  t.string   :website0 S3 q2 V5 f( J; R, {& Q$ [/ I# a
  t.string   :email. a' D9 V# M1 t
  t.string   :phone- ]1 o# o9 t" d9 J9 ^5 k+ a+ P- U
  t.string   :type
) Q1 S3 R! b3 I1 T% m: E( p  t.text     :settings
- ?; Z% q! h1 j+ N% g) S9 _9 Y  t.integer  :profilable_id# Y3 h, D5 w9 C6 \( U) U. C3 H% S
  t.string   :profilable_type
0 t0 j/ g5 o5 \/ j, Q8 ?: W4 G- g  t.timestamp; n# N, Q# j) b; {% a5 v
end& E: \& r; C8 n2 `; w
选项2.密钥/值存储- G& r6 a" L' p0 ?) v3 O
class KeyValueProfile  true do |t|( L6 r* P$ C2 z  ~  Y4 [4 ~- T3 Y
  t.string   :name
1 N! P# }7 ~. B0 Y7 E6 v1 f2 }3 c6 E6 X  t.string   :website9 x' Q$ v" d( |. t. w5 X
  t.string   :email
6 S4 _' N9 ?( G. f- f8 {  t.string   :phone6 o7 }5 t  n5 V  e' |2 ~
  t.string   :type
: f! |  x( O6 r; e( F  t.integer  :profilable_id9 q, s% C7 a3 {! W6 O
  t.string   :profilable_type
3 |/ b3 g+ o0 O6 A/ h  t.timestamp/ o( z: U2 V1 H6 z1 h# `  Z* [
end; v7 T0 x3 y( W' |
create_table :settings, :force => true do |t|, l8 E3 m8 J4 `  Y7 |% G
  t.string   :key/ a1 l  a! N/ [8 a! X
  t.text     :value
3 H. t+ R/ [2 }, a  t.integer  :profile_id$ f; F0 j% e* T5 Z/ x
  t.string   :profile_type
% r7 b# q) `! _0 q  V% T, O  t.timestamp
; E- n) j; q  Q6 X' n, o7 qend! |+ N+ f) j/ a' W; p4 [7 ?( C6 x/ I
您会选择哪一个?
( F4 M! O0 M7 a( n$ y( \. ^假设我有99%的时间不需要按自定义进行搜索settings。只是想知道在性能和未来问题的可能性方面要进行哪些权衡。自定义的数量settings可能会在10到50之间。
+ ^% `6 m/ X' U我宁愿使用设置表的第二个选项,因为它遵循ActiveRecord面向对象的约定。但是我想知道在这种情况下是否会以过高的性能成本来实现。4 t3 c/ ~. x1 n+ O( ?2 G
注意:我只想知道RDBMS。这将非常适合MongoDB / Redis / CouchDB / etc。但我只想了解SQL的优缺点。: A7 \/ U. I! a" d8 Q
                # s6 W' X* a+ F* X
解决方案:* T/ M; D! `! l2 L: z: H( d
               
& Y" l- m7 g' V0 _
0 P% Q! c* k2 x4 y. C! q& S
' n: I7 Y/ E$ j0 P1 `                我遇到了同样的问题,但最终做出了决定。5 y1 k' r' d; ^8 c
哈希序列化选项导致维护问题。很难查询,扩展或重构此类数据-; E! w9 W& K6 n: _
任何细微的更改都需要迁移,这意味着读取每个记录进行反序列化和序列化,并且取决于重构序列化异常,可能会发生。我同时尝试了二进制序列化和JSON-" {( g1 R# B$ j
第二种方法更易于提取和修复,但仍然很麻烦。
0 G9 l- U. U; x" }我现在正在尝试使用单独的设置表-+ k. L1 i* A. t- W$ j
易于维护。我计划将Preferences
7 S% s  q" m4 u* U  X* Mgem用于大多数抽象的目的,以便于使用。我不确定它是否可以与Rails 3一起使用-它很小,所以我可以根据需要扩展它。* g1 h3 D, f1 N7 ?
2013年11月更新
4 @. d3 x( v, y; u# N; d最近发布的Rails 4支持PostgreSQL 9.1+的重大新功能,例如动态数据集的 hstorejson
% |! A3 J! S  C4 h, j) v列类型。这是一篇介绍Rails 4中hstore用法的文章。两种类型都支持索引和高级查询功能(Json with Pg
3 B; ~8 w- ~: ~$ Z. z' h/ }) E9.3)。带有activerecord-postgres-hstore gem的Rails
' }0 \* l/ e0 B% Z3用户也可以使用Hstore。
+ g& e0 J* w; z我正在将项目中的一些非关键首选项表迁移到hstore。在迁移中,我只更新表定义和execute每个表一个SQL查询以移动数据。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则