sql-如何实现一个表,其中很少有属性只是对另一个元组的引用?
我有一个Sql表,如下所示:-sql-如何实现一个表,其中很少有属性只是对另一个元组的引用?,sql,oracle,oracle11g,oracle-adf,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 |
> 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
和A1
对于每个元组都是唯一的A2
和B1
是当前行的B2
属性指向的元组值REF\u B
和C1
是当前行的C2
属性指向的元组值REF\u C
指同一个表中另一个元组的REF_B
,我们应该从中获得ID
的值Bx
指同一个表中另一个元组的REF_C
,我们应该从中获得ID
的值Cx
1
中的更改传播到元组2
和3
。现在我们已经使用编程方法(Java代码)来实现这一点
这既难又不美
拟议变更
将表1
分为三个表
> 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
将是这三个表联接的可更新视图
> 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 |
|--------------|
- 您认为这种方法有任何可能的缺陷吗
- 有更简单的解决办法吗
- 对于新的
,我们可能有哪些限制<代码>表1直接映射到ADF实体对象表1
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;
听起来您建议的解决方案是对原始表进行规范化,假设您将REF_a和REF_B(尽管我自己将这些a_ID和B_ID命名)作为table1_B和table1_c的外键。这就是你的想法吗 我不清楚的一点是,如果两列包含相同的数据,为什么这里需要两列(A1和A2)。如果结果中需要两个副本,您不能将其合并到一个列中,然后简单地选择两次吗?即,假设您只有一个“A”列而不是A1/A2列:
select A, A from table1....
但是,我可能错过了这里的预期用例
我从未使用过ADF,但oracle文档似乎暗示您可以引用以下视图:
实体对象映射到数据源中的单个对象。在绝大多数情况下,这些>是数据库中的表、视图、同义词或快照
如果这不是很有帮助,也许可以添加一些关于此表的基本用途的详细信息。我对触发器和Sql都是新手,所以我可能错了,但您似乎假设元组2和3已经存在,然后我们插入元组1。但在我的场景中,元组1总是在插入引用元组之前出现。此外,这是一个简化的情况。我的表有三个以上的
A
属性。即使我在插入元组2和3的行时手动处理数据复制,它仍然忽略了更多问题。对于元组1,可以更新任何属性。因为属性组C
实际上运行数百个,所以我们不能为所有属性设置触发器。此外,将数百个属性复制到虚拟行是没有效率的。我不确定我当时是否理解了你的问题。在你的问题中让列名和列内容相等会把事情搞砸。对不起,我想不出别的了。请不要将列内容与列名称关联B1
等于B1
等于1=2.)但是b1
肯定等于其他行中的b1
。