多列(每种类型一列)与单个TEXT / Clob列

时间:2009-11-09 23:05:19

标签: sql mysql database performance

我需要在数据库中存储其他表列的一些 diffs 。我想用一张桌子。

选项A

包含4列的表格:

  • id
  • content_type(VARCHAR 255,将:datetimeintegervarchartext / clob ...)
  • old_content(CLOB / TEXT,内容类型的软件序列化数据)
  • new_content(CLOB / TEXT,内容类型的软件序列化数据)

选项B

表〜~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?

其他可能相关的内容:

  • 对于当前项目,我假设非TEXT / CLOB列中将有更多数据。
  • 我不想搜索非ID列,因此不需要额外的索引。

2 个答案:

答案 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)
...

IntChangeStrChangeTxtChangeDataChange的类型,因此ID充当主键和外键,且号码与ID表中的DataChangecontent_type是分类器列。类似(超类型/子类型)示例的 Here is a model

答案 1 :(得分:0)

这不是对您的问题的完整回复,但请查看SQL 2008中的“Column Sets”。您可以将其用于OPTION A ...并使其看起来像OPTION B.