多列(每个类型一列)与单个TEXT/Clob列的区别

3
我需要在数据库中存储其他表列的一些差异。我想使用单个表。
选项A:
具有4列的表:
- id - content_type(VARCHAR 255,将是:datetime、integer、varchar、text/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的方法,并且也感觉更加舒适,但我准备接受讲课。
你会使用A还是B?为什么?每个选项的权衡是什么?或者也许有C吗?
其他可能相关的事项:
- 对于当前项目,我假设非TEXT/CLOB列中将有更多数据。 - 我不想搜索非ID列,因此不需要额外的索引。
2个回答

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 作为主键和外键,在 DataChange 表中的编号与其相同。 content_type 是分类器列。这里是类似(超类型/子类型)的示例模型


0

这不是对你问题的完整回答,但是看一下 SQL 2008 中的 "Column Sets"。你可以将其用于 OPTION A ... 并使其看起来像 OPTION B。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接