我需要在数据库中存储其他表列的一些 diffs 。我想用一张桌子。
包含4列的表格:
id
content_type
(VARCHAR 255,将:datetime
,integer
,varchar
,text
/ clob
...)old_content
(CLOB / TEXT,内容类型的软件序列化数据)new_content
(CLOB / TEXT,内容类型的软件序列化数据)表〜~10 +列:
id
content_type
(VARCHAR 255)old_datetime
(DATETIME)new_datetime
(DATETIME)old_integer
(INTEGER)new_integer
(INTEGER)old_string
(VARCHAR 255)new_string
(VARCHAR 255)old_text
(CLOB / TEXT)new_text
(CLOB / TEXT)一次只能设置一个元组,其他元组将是NULL
。
目前我更喜欢选项B - 因为我不是RDBMS中序列化数据的忠实粉丝。但是,我不知道数据库(在我的情况下是MySQL,可能是Postgre)在处理(压缩)选项A方面是否比选项B更好。
我在其他一些项目(JBoss jBPM)中看到了B方法,并且对B感觉更舒服,但我已经准备好进行演讲了。
您会使用A或B吗?为什么?每个选项的权衡是什么?或者可能是C?
其他可能相关的内容:
答案 0 :(得分:1)
嗯,还有一个解决方案,更多的表具有超类型/子类型结构。关于这一点的好处是没有额外的空值,例如:
TABLE DataChange (ID (PK), content_type, ChangeTime)
TABLE IntChange (ID (PK=FK), old_value int, new_value int)
TABLE StrChange (ID (PK=FK), old_value varchar(255), new_value varchar(255))
TABLE TxtChange (ID (PK=FK), old_value text, new_value text)
...
IntChange
,StrChange
和TxtChange
是DataChange
的类型,因此ID
充当主键和外键,且号码与ID
表中的DataChange
。 content_type
是分类器列。类似(超类型/子类型)示例的 Here is a model 。
答案 1 :(得分:0)
这不是对您的问题的完整回复,但请查看SQL 2008中的“Column Sets”。您可以将其用于OPTION A ...并使其看起来像OPTION B.