请教一下服务器端Java数据库开发遇到的几个问题

软件和网站开发以及相关技术探讨
回复
头像
bjfbm
帖子: 124
注册时间: 2014-05-27 0:30

请教一下服务器端Java数据库开发遇到的几个问题

#1

帖子 bjfbm » 2014-08-08 0:24

以前是学过数据库管理系统原理与设计的,但一直在别的领域编程,现在在服务器端数据库开发时碰到了一些问题,不知发在这里合适否。

同问题相关部分的表有几对:

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等数值)个


如果问题是无解的,请问是否可以实现别的什么次优方案?在下先谢谢了!
头像
astolia
论坛版主
帖子: 6436
注册时间: 2008-09-18 13:11

Re: 请教一下服务器端Java数据库开发遇到的几个问题

#2

帖子 astolia » 2014-08-18 20:22

代码步骤基本如下
1、对关系双方的表加锁,防止被修改
2、查询关系双方的存在性/数量
3、如果符合需求则添加关系
4、解锁
头像
bjfbm
帖子: 124
注册时间: 2014-05-27 0:30

Re: 请教一下服务器端Java数据库开发遇到的几个问题

#3

帖子 bjfbm » 2014-08-19 3:55

astolia 写了:代码步骤基本如下
1、对关系双方的表加锁,防止被修改
2、查询关系双方的存在性/数量
3、如果符合需求则添加关系
4、解锁
十分感谢!我看到这里面的关键是锁。一直没注意过sql语句里有关锁的部分,我先研究研究,估计在锁的粒度和避免死锁、效率、多用户快速响应、大事务处理方面我还会有些问题,希望到时候还能向你请教!
头像
astolia
论坛版主
帖子: 6436
注册时间: 2008-09-18 13:11

Re: 请教一下服务器端Java数据库开发遇到的几个问题

#4

帖子 astolia » 2014-08-19 10:29

要看你的数据库和程序是怎么设计的了,如果查询多修改少,加个不影响读取的共享锁,对整体性能影响不大
如果没法修改表结构只能改代码,那能优化的余地也不大。比如你完全可以不进行删除操作,只加个无效标记,这样就不存在添加关系时双方可能已被删除的问题了
即使程序里有检查,外键还是尽可能加上。防止各种意外,牺牲点性能还是值得的
回复