在Oracle中对标准化数据进行版本控制

时间:2014-04-15 00:19:54

标签: oracle database-design triggers oracle11g normalization

我正在尝试找一种好方法来检查我通过批量加载(SQLLoader)提供的数据是否已存在于我的数据集中,因此我不再加载它。

目前我们有这样的设置,

TableA
col1, col2, bulkLoadName

此表格包含数据

col1, col2, bulkLoadName
"Joe", 35, "Load1"
"Tim", 65, "Load1"
"Ray", 95, "Load1"
"Joe", 35, "Load2"

我想把它改成,

TableA
PK, col1, col2

TableAtoBulkLoadName
PK, TABLEA_PK, BulkLoadName_PK

BulkLoadName
PK, bulkLoadName

数据的样子,

PK, col1, col2
1, "Joe", 35
2, "Tim", 65
3, "Ray", 95

PK, TABLEA_PK, BulkLoadName_PK
1, 1, 1
2, 2, 1
3, 3, 1
4, 1, 2

PK, bulkLoadName
1, "Load1"
2, "Load2"

这使数据规范化,因此我可以轻松地检查特定负载而无需字符串搜索,MOST重要地阻止我在数据库中加载重复数据,因为在以后的加载中再次定义了某些内容。

我无法决定如何实施重复检查。我不熟悉SQL,需要一个ORACLE 11g的解决方案。我看了,我想出了两个可能的解决方案......

解决方案1:

使用临时表来存储批量加载,并在加载后运行存储过程以进行检查。

解决方案2:

MERGE上使用TableA子句向TableA添加新记录,或者如果记录已存在,则在TableAtoBulkLoadName中创建新的交叉记录。

我现在的问题是,所有的背景信息都存在于这些方法中的专业人士和者是什么?这种正常化是否正常?有没有标准的方法来做这种事情?

谢谢!

1 个答案:

答案 0 :(得分:1)

严格来说,从绩效角度来看,如果你能在一个陈述中做所有事情,那么通常更好。

但是一旦你开始以各种方式转换数据,我个人发现通过使用临时表,生成的代码更容易阅读和修改。