sql - 如何实现一个表,其中几个属性只是对另一个元组的引用?

时间:2012-01-24 09:32:23

标签: sql oracle oracle11g oracle-adf

我有一个Sql表,如下所示: -

> select * from table1;
    |--------------------------------------------------|
    | ID | A1 | A2 | B1 | B2 | C1 | C2 | REF_B | REF_C |
    |--------------------------------------------------|
    | 1  | a1 | a1 | b1 | b1|  c1 | c1 |  1    |   1   |
    | 2  | a2 | a2 | b2 | b2|  c1 | c1 |  2    |   1   |
    | 3  | a3 | a3 | b1 | b1|  c1 | c1 |  1    |   1   |
    |--------------------------------------------------|
  • ID是主键。
  • A1A2对每个元组都是唯一的。
  • B1B2是当前行的REF_B属性指向的元组的值。
  • C1C2是当前行的REF_C属性指向的元组的值。
  • REF_B指的是同一个表中另一个元组的ID,我们应该从中获取Bx的值。
  • REF_C指的是同一个表中另一个元组的ID,我们应该从中获取Cx的值。

在上述方法中,我们面临的一个明显问题是将元组1中所做的更改传播到元组23。现在我们已经使用程序化方法(Java代码)来实现这一目标。

这既困难又不美观。

建议的变更

table1划分为三个表格。

> select * from table1_a;
    |------------------------------|
    | ID | A1 | A2 | REF_B | REF_C |
    |------------------------------|
    | 1  | a1 | a1 |  1    |   1   |
    | 2  | a2 | a2 |  2    |   1   |
    | 3  | a3 | a3 |  1    |   1   |
    |------------------------------|

> select * from table1_b;
    |--------------|
    | ID | B1 | B2 |
    |--------------|
    | 1  | b1 | b1 |
    | 2  | b2 | b2 |
    |--------------|

> select * from table1_c;
    |--------------|
    | ID | C1 | C2 |
    |--------------|
    | 1  | c1 | c1 |
    |--------------|

table1将是这三个表的连接的可更新视图。

  • 你认为这种做法存在任何可能的缺陷吗?
  • 有更简单的解决方案吗?
  • 我们对新table1可能有哪些限制。 table1直接映射到ADF实体对象。

2 个答案:

答案 0 :(得分:0)

使用触发器:

CREATE OR REPLACE TRIGGER upd_table1
BEFORE UPDATE OF a1
    OR UPDATE OF a2
    ON TABLE1
REFERENCING new AS new
BEGIN
   UPDATE table1
      SET b1 = new.a1, b2 = new.a2
    WHERE refb = new.id;
   UPDATE table1
      SET c1 = new.a1, c2 = new.a2
    WHERE refc = new.id;
END;

答案 1 :(得分:0)

听起来您提出的解决方案是原始表格的标准化,假设您制作了REF_A& REF_B(虽然我自己将这些A_ID和B_ID命名为)table1_b和table1_c的外键。那是你的想法吗?

我不清楚的一件事是,如果它们包含相同的数据,您需要两列(A1和A2)。难道你不能将它合并到一个列中,如果在结果中需要两个副本,那么只需选择两次吗?即,假设您只有一个“A”列而不是A1 / A2:

select A, A from table1....

但是,我可能会错过这里的预期用例。

我从未使用过ADF,但oracle文档似乎暗示你可以引用一个视图:

  

实体对象映射到数据源中的单个对象。在绝大多数情况下,这些>是数据库中的表,视图,同义词或快照。

如果这不是很有帮助,可能会添加一些有关此表的基本目的的详细信息。