以前是学过数据库管理系统原理与设计的,但一直在别的领域编程,现在在服务器端数据库开发时碰到了一些问题,不知发在这里合适否。
同问题相关部分的表有几对:
T1,R1,T2,R2 T1、T2是记录一些数据的,而R1\R2是记录T1到T2同Tx(x包括从1到2)表的关系的。
Rx(Rid, Tx,Idx,Ty,Idy): 表示的是表Tx中id为Idx的行同表Ty中id为Idy的行之间的关系。T表的结构同问题无关。
库表的整体结构不太可能改变了。
基本背景:java、tomcat、oracle、jdbc
问题的起因:
由于每个R表记录的是某一个T表同两个T表中的数据的关系的(R1记录T1和T1以及T1和T2的关系),所以R表无法通过外键约束来保证在R表中关系双方id在各自T表中一定是存在的。另外,根据设定,R表中某些关系是可以重复建立的,有些是不能重复建立的;能重复建立关系的,有些还是有数量限制的(比方对于四条腿的桌子来讲:桌面和桌子腿之间最多只能建立4个关系,少了只是表明还没有装配完,但绝对不能多余4个)。
问题:
1. 如何在缺乏外键约束下,在建立关系时,保证R表中一个关系的完整性?(在创建关系时,关系双方所涉及的两个T表中的两个id别被删除了)
2. 如何根据运行过程中设定的值,来限定某种关系能够建立到某个最大的个数?比如在运行中我知道T1中id为10的记录同T2中id为20的记录之间的关系只能建立x(x可以是1、2、3、4等数值)个
如果问题是无解的,请问是否可以实现别的什么次优方案?在下先谢谢了!
请教一下服务器端Java数据库开发遇到的几个问题
- bjfbm
- 帖子: 124
- 注册时间: 2014-05-27 0:30
- astolia
- 论坛版主
- 帖子: 6436
- 注册时间: 2008-09-18 13:11
Re: 请教一下服务器端Java数据库开发遇到的几个问题
代码步骤基本如下
1、对关系双方的表加锁,防止被修改
2、查询关系双方的存在性/数量
3、如果符合需求则添加关系
4、解锁
1、对关系双方的表加锁,防止被修改
2、查询关系双方的存在性/数量
3、如果符合需求则添加关系
4、解锁
- bjfbm
- 帖子: 124
- 注册时间: 2014-05-27 0:30
Re: 请教一下服务器端Java数据库开发遇到的几个问题
十分感谢!我看到这里面的关键是锁。一直没注意过sql语句里有关锁的部分,我先研究研究,估计在锁的粒度和避免死锁、效率、多用户快速响应、大事务处理方面我还会有些问题,希望到时候还能向你请教!astolia 写了:代码步骤基本如下
1、对关系双方的表加锁,防止被修改
2、查询关系双方的存在性/数量
3、如果符合需求则添加关系
4、解锁
- astolia
- 论坛版主
- 帖子: 6436
- 注册时间: 2008-09-18 13:11
Re: 请教一下服务器端Java数据库开发遇到的几个问题
要看你的数据库和程序是怎么设计的了,如果查询多修改少,加个不影响读取的共享锁,对整体性能影响不大
如果没法修改表结构只能改代码,那能优化的余地也不大。比如你完全可以不进行删除操作,只加个无效标记,这样就不存在添加关系时双方可能已被删除的问题了
即使程序里有检查,外键还是尽可能加上。防止各种意外,牺牲点性能还是值得的
如果没法修改表结构只能改代码,那能优化的余地也不大。比如你完全可以不进行删除操作,只加个无效标记,这样就不存在添加关系时双方可能已被删除的问题了
即使程序里有检查,外键还是尽可能加上。防止各种意外,牺牲点性能还是值得的