日期:2014-05-19  浏览次数:20410 次

数据库基础概念问题,表关系问题,在线等!
数据库基本概念的问题,我还没个清晰的概念
基础不扎实啊,不知道怎么办
在公司又不敢问,怕太菜被人笑话,领导又喜欢骂人

小弟编程时间不长
刚来这家公司
然后就把一个ASP.NET项目交给小弟我一个人做
本人从来没有单独负责过项目
但是也只有硬着头皮上
于是需求分析文档编写画图设计数据库
开始准备用powerdesign设计数据库
但领导非要我用VISIO画,然后交给他检查
只好用VISIO画了个图,我以前也没画过,乱画完交给他
然后就是挨了几次骂,说我没把表关系反映好
最后搞了一个星期才把VISIO图画好了
然后建表,又说不准企业管理器里建,非要用脚本写,我说写就写吧
反正create   table   xxxx全写完了
写完后,旁边有一小子也是新来的
他做他的项目,建好表后直接在企业管理器关系图里拖关系
结果被领导看见又是一顿骂,说不能这么做
so我看见了我也没敢那么做
数据库设计完了现在已经开始在写代码了

现在:问个数据库基础问题
我没在企业管理器里的关系图里拖关系
所以当对一些有关联的表进行操作的时候
我都是在存储过程里对那些有关系的表在一个事务里进行操作
我也不知道怎么形容了,举个例子吧
2个表有1对多关系,合同表,合同明细任务表
一个合同下有多个合同明细任务
我没在企业管理器里拖他们之间的关系
而是在合同明细任务表里加了个字段“合同ID”
用来反映他们的关系
要进行相关的增加,修改,删除操作的时候就在存储过程里对这两张表放在一个事务里同时进行操作
比如要删除某条合同,那该合同下的明细任务自然也要一起删掉
我就是这么写的
CREATE   proc   Delete_合同
(
@合同id   int
)
as
declare   @任务id   int
set   xact_abort   on
begin   tran
set   nocount   on
delete   from   合同表   where   合同id   =   @合同id
select   @任务id=任务id   from   合同明细任务表   where   合同id   =   @合同id
delete   from   合同明细任务表   where   任务id   =   @任务id
set   nocount   off
commit   tran

请问,这样做行吗?后期会不会出什么崩溃啊之类的问题啊?
这是标准的做法吗?
如果在那个企业管理器里拖了关系
就是想链子一样的哪个
那又该怎么做呢?
哪种方式好呢?还有什么方式可以建关系呢?

菜鸟一个,谋份程序员的工不容易,希望各位高手指点!

------解决方案--------------------
你在 企业管理器中把关系画好以后,关系 就确定了。
关系看看范式的书,其实把一对一 多对多 一对 多的 关系搞清楚就可以搞定大部分了。
有时候 拘泥于范式 也不好。有一些冗余可以提高性能。
而且设计关系 其实就是为了保持数据关系的一致性和完整性。
所以不一定非要在数据库做。
有以下的办法:
1.在数据库建立数据表的约束。用存储过程和触发器维护关系和约束
2 在程序中维护。ado.net中使用事务,同样可以做到。很多的人也推崇这样做。因为这样会很灵活。有时候你会发现硬性的约束也会有问题。
3.可以通过com+的事务维持(系统级别)。

在powerdesign 画好以后 看看点击表定义中script 标签,你会发现你建立的表和关系代码都生成好了。我喜欢用powerdesign !
另,感觉你们领导也有问题。用什么工具都是次要的,完成就好!:)


------解决方案--------------------
没有关系也没有关系的。

如果你的程序能控制好逻辑,没有关系、约束等,数据库也能工作得很好……

好老大啊,先把这些基础的东西吃透,对今后的发展是大有裨益的,一开始就依赖于工具的确不是好事。
------解决方案--------------------
其实lz没有必要把所有的联系全部加上去的,特别是UserID!
这种字段在很多的表里面都会有所体现,这样的联系一目了然,你加上了联系反而会增加看起来的复杂度;
而且联系主要是在项目中要有所体现,数据库里面是否建立无所谓的;
我就很喜欢一个标志位加上一个连接字段和不同的表建立联系,在数据库里面是无法实现的把;
可是对设计的人来说却很好理解的阿
------解决方案--------------------
比如 user类 role类两个类就是多对多的关系 就是三张表 user表 role表 user和role的关系表
关系表以把user表和role表的主键做外键 不过多对多关系尽可能简化成一对多的关系 其实数据库表中关系还是以一对多为主
------解决方案--------------------
建表的时候就可以把关系如约束建上去.
create table students
(
stuid char(10),
stuname char(8),
sex char(2),
address varchar(40),
constraint stuidpk primary key(studid),
constraint sexck check(sex in( '男 ', '女 '))
)
create table courses
(
csid char(10),
csname char(40),
credit char(4),
constraint cspk primary key(csid)
)

create table grade
(
stuid char(10),
csid char(10),
grade numeric(5,2),
constraint studid_csid_pk primary key(stuid,csid),
constraint studid_fk foreign key(studid) references students(stuid),
constraint csid_fk foreign key(csid ) references courses(csid )
)