请问一个关于数据库表映射的难题。。。详细请进
现在我们正开发一个自己的软件产品,自己的数据库中定义了一张表A,表中有若干字段id,name,age,address。
而客户方也已经有了一个数据库,表结构完全未知。
我们自己表中没有数据,所以所有查询必须到客户数据库中查询。
考虑这样一个问题,假如有这么一个查询“select id,age from A where age>20”
现在需要将自己的表结构和客户方的表结构做一个映射。
如id,name对应的是客户方表table1中的id和username
而age和address对应的是客户方表table2中的userage和dizhi
这种映射的信息我想用xml文件来保存,那查询语句就可能变成了:
select table1.id table2.userage from table1,table2 where table2.age>20
上面的语句有个明显的问题是:table1和table2的关系没有保存,查出来的数据肯定有大量的冗余。真正需要的可能是下面这样的语句,
select table1.id table2.userage from table1,table2 where table2.age>20 and table1.id=table2.id
xml文件中如何来保存客户方表与表之间的关系,如果是跟三个表关联呢?
问题点数:0、回复次数:11Top
1 楼sunnf(sunnf)回复于 2003-06-02 10:17:12 得分 0
gzTop
2 楼lynx(lynx)回复于 2003-06-02 10:19:31 得分 0
你为什么不建视图呢?让你的XML来保存视图好了。Top
3 楼loveolala(一剑霜寒)回复于 2003-06-02 10:34:58 得分 0
怎么建?
目前问题是这样的,客户方数据库是另外一个公司的产品,肯定是不希望你去修改他的数据库,而且各个公司的数据库结构也是各不相同,我现在最好是能在不修改对方数据库的情况下,通过配置文件来保存所有的对应关系。Top
4 楼jmj83(我心如水,纯而不静)回复于 2003-06-02 10:48:55 得分 0
有点不明白你的意思,
你需要把数据保到本地数据库中吗?Top
5 楼loveolala(一剑霜寒)回复于 2003-06-02 11:42:08 得分 0
需要保存到本地数据库中。(但实际保存不保存都不重要)
具体情况是这样,我们要开发一个产品,需要分析客户已有的数据,但客户的数据库是各不相同的,所以我们的所有分析应该基于自己的数据结构来开发,但实际数据却要到客户数据库中去取,所以中间必须要有一个转换的过程,才能生成一个真正的有用的查询语句,然后到客户数据库中去查询,这个映射过程是通过界面由客户自己设定的。Top
6 楼llm06(blacksheep)回复于 2003-06-02 12:24:54 得分 0
我认为,你可以使用视图来解决这个问题。
你在自己的库中建一个数据库链接,链接到客户方数据库
然后你在自己的库中建一个视图,既可以访问自己的库,又可以访问客户的库,视图的字段名和数据你想怎样就怎样。
这样你的程序就比较独立,每次只需要修改视图什么都解决了Top
7 楼loveolala(一剑霜寒)回复于 2003-06-02 13:09:27 得分 0
我不太清楚,自己数据库的视图如何和别的数据库对应起来?而且数据库类型都有可能是不一样的,我这边是oracle的,对方是不确定的。
to:lynx(lynx):
用xml如何来保存一个视图信息??举个例子好吗?Top
8 楼loveolala(一剑霜寒)回复于 2003-06-02 15:18:22 得分 0
急啊,请大家说说你们的想法,谢谢!Top
9 楼llm06(blacksheep)回复于 2003-06-02 15:24:12 得分 0
如果对方的数据库也是oracle的话,我觉得我上面的办法是可行的
如果不是的,那你只能编程实现了Top
10 楼loveolala(一剑霜寒)回复于 2003-06-02 16:42:24 得分 0
恩,我想也是只能编程实现,但首先必须要能灵活保存客户方数据库和自己数据库之间的映射信息。我现在想了一种方案(我们自己数据表是一个,结构是固定的,对方可变),信息格式保存如下:
<column-mappings>
<own-column>自己数据表字段名1</own-column>
<outer-table>对方表名1</outer-table>
<outer-column>对方字段名1</outer-column>
</column-mappings>
<column-mappings>
<own-column>自己数据表字段名2</own-column>
<outer-table>对方表名2</outer-table>
<outer-column>对方字段名2</outer-column>
</column-mappings>
<!--客户方表关系保存-->
<relationships>
<!--下面说明客户表1和表2通过A和B发生关系-->
<relationship>
<fisttable>对方表名1</firsttable>
<secondtable>对方表名2</secondtable>
<first-field>表一中的字段A</first-field>
<second-field>表二中的字段B</first-field>
</relationship>
<relationships>
这样的话,当对自己数据表发出一个查询请求的时候
如:select id,age from A where age>20
我首先可以通过<column-mappings>里的信息转换成:
select a.id ,b.age form a,b where b.age>20
然后我再查找a和b的关系,如果有a中的a1字段和b中的b1字段发生关系,那么我再把查询语句处理成:select id,age from A where age>20 and a.a1=b.b1
大家帮我看一下,我这样想的是否周到?对于我的功能有什么遗漏的地方??
谢谢!!
Top
11 楼sunshine008(沧海笑)回复于 2003-06-03 14:52:21 得分 0
1。如果你无法确定对方是什么数据库,当然这简直是不可能的,如果是ORACLE,那就简单了,就像上面的仁兄说的那样 创建数据库链,创建视图,然后就像操作自己的表一样。
2。但是如果对方的数据库不是Oracle,那就用ODBC,或者其它方式连接。然后将对方的数据提取到你自己的数据库中,当然 视图或者临时表存放哪些数据都可以,然后就象操作自己的表一样了。Top




