数据库基本概念的问题,我还没个清晰的概念
基础不扎实啊,不知道怎么办
在公司又不敢问,怕太菜被人笑话,领导又喜欢骂人小弟编程时间不长
刚来这家公司
然后就把一个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.   

    ALTER TABLE Table2 ADD CONSTRAINT Relation1 FOREIGN KEY ([Id]) _
       REFERENCES Table1 ([Id])
      

  2.   

    select @任务id=任务id from 合同明细任务表 where 合同id = @合同id
    这个没有必要吧 直接删除id等于指定id的明细就可以吧
      

  3.   

    任何企业管理器里面可以设计数据库的动作都可以用语句表示其实管理器也是在执行语句,只不过是由一个好的ui界面给你办法:
     ALTER   TABLE   [dbo].[SGMRAB]   ADD     
      CONSTRAINT   [FK_SGMRAB_SGMRAA]   FOREIGN   KEY     
      (   
      [RAB001]   
      )   REFERENCES   [dbo].[SGMRAA]   (   
      [RBA001   
      )   ON   DELETE   CASCADE
      

  4.   

    你在 企业管理器中把关系画好以后,关系 就确定了。
    关系看看范式的书,其实把一对一  多对多  一对 多的 关系搞清楚就可以搞定大部分了。
    有时候 拘泥于范式 也不好。有一些冗余可以提高性能。
    而且设计关系  其实就是为了保持数据关系的一致性和完整性。
    所以不一定非要在数据库做。
    有以下的办法:
            1.在数据库建立数据表的约束。用存储过程和触发器维护关系和约束
            2 在程序中维护。ado.net中使用事务,同样可以做到。很多的人也推崇这样做。因为这样会很灵活。有时候你会发现硬性的约束也会有问题。
            3.可以通过com+的事务维持(系统级别)。        在powerdesign 画好以后  看看点击表定义中script 标签,你会发现你建立的表和关系代码都生成好了。我喜欢用powerdesign !
             另,感觉你们领导也有问题。用什么工具都是次要的,完成就好!:)
      

  5.   

    楼上的,谢谢你的解答,有了点概念
    但是我还是想问问,对于我目前的状况:
    我现在那些表之间完全没有建立关系、
    不管是企业管理器里面拖关系也好,还是脚本也好,我都没建关系
    请问这样做可以吗?感觉我现在做的功能还是可以实现啊
    增加,删除,修改,查询,都可以实现啊
    但是我自己也不知道这样做是不是对的
    就是担心怕以后数据上会出问题
    顺便说下,目前我做的是个比较简单的CRM
    之前那个VISIO图已经被我画的到处是关系线了,几十张表关系连的乱七八糟
    一个客户表就和N张表有关系
    如果我重新再去建立他们的关系的话我不知道要画多长时间我才能把头绪整理出来
    现在真的痛苦的要死
    天天晚上急的睡不着觉
      

  6.   

    其实 你做删除的时候 关系就很重要了。
    如果你没有做关系,可能会出现很多的冗余数据
    举个例子  课程是一个表  班级信息是一个表   那么必须有一个表来记录 课程和班级的关系那么课程和班级就是 多对多的关系。
    如果你删除了 班级。   那么你是否要删除班级与课程的关系表中的 涉及到该班级的所有的课程呢?  当然是了。如果你只删除班级,那么就会出现垃圾数据。例
    课程表 
      课程id   课程名字
    班级表
       班级id  班级名称
    班级和课程关系表
      班级id   课程id好好想想吧!
      

  7.   

    楼上的,我知道啊
    但是我不会出现只删除班级的情况啊
    我把删除都写进存储过程里了
    只要从班级表中删除班级,就把与该班级有关联的课程从课程表中也删掉
    并且两个删除都写在一个TRAN里,然后COMMIT这个TRAN我就是想问问象我这样做好不好。
    在页面上测试了下,反正功能上看起来貌似没什么问题
    但是数据库没建立关系,都是我在存储过程里操作
    实在是心里没底能留个MSN么?想向高手们好好请教请教,谢谢!
      

  8.   

    也就是说不用建立表之间的关系了??
    即不用写脚本Relation1 FOREIGN KEY
    也不用在企业管理器里拖线
    是么?
    确定的话就给分,呵呵
      

  9.   

    昨天等到11点半就睡觉了
    今天早上上班一看,又有说这样控制不行
    难道一定要建关系吗?
    我那个表关系好象很复杂,在VISIO图里,线拖的到处都是
    如果在企业管理器里拖关系,不知道要拖多少
    而且领导也不准这样做
    如果写脚本,那基本意味着要重新做一遍
    按目前的做法,又不知道能不能保证数据完整性
    现在是有人说可以,有人说不行
    我是茫然的
      

  10.   

    其实lz没有必要把所有的联系全部加上去的,特别是UserID!
    这种字段在很多的表里面都会有所体现,这样的联系一目了然,你加上了联系反而会增加看起来的复杂度;
    而且联系主要是在项目中要有所体现,数据库里面是否建立无所谓的;
    我就很喜欢一个标志位加上一个连接字段和不同的表建立联系,在数据库里面是无法实现的把;
    可是对设计的人来说却很好理解的阿
      

  11.   

    哎,问了搞不好又是一顿骂
    还有,领导还不让用baidu,只让用google,当然,我也不喜欢baidu
    hy_lihuan
    那么请问
    象我那样操作数据,把有关系的表全放存储过程里操作
    能保证数据完整性吗?
    看了这么多人的回答
    这个问题还是不清楚
    关键是我这一个人搞一个项目,也没什么人问,只好上CSDN来请教高手
      

  12.   

    建议看看normal forms definition
    用script有很大的好处就是可以automation, repeatable, explicit 是UI无法替代的
      

  13.   

    比如 user类 role类两个类就是多对多的关系 就是三张表  user表 role表 user和role的关系表
    关系表以把user表和role表的主键做外键 不过多对多关系尽可能简化成一对多的关系 其实数据库表中关系还是以一对多为主
      

  14.   

    十分怀疑你领导的脑子有问题!
    ==============================================================================
    .net技术交流群    QQ8793209 欢迎职业程序员加入
      

  15.   

    比如 user类 role类两个类就是多对多的关系 就是三张表 user表 role表 user和role的关系表
    关系表以把user表和role表的主键做外键 不过多对多关系尽可能简化成一对多的关系 其实数据库表中关系还是以一对多为主
    那么比如这三张表我并没有在企业管理器里建关系也没在脚本里建关系
    直接用存储过程进行操作
    请问有问题吗?
      

  16.   

    照你的想法数据与数据之间会失去约束关系比较混乱
    其实你们领导让你们在脚本里写sql这样最起码能锻炼基本功啊
    把数据库换成oracle mysql也是一样的做法
    其实什么问题换个角度想想页就无所谓了 关系还是最好建立起来
      

  17.   

    建议你以后看一下nhibernate 会对你的对象 数据库设计大有好处的
      

  18.   

    CSDN总不缺乏像楼上这样的同学,我长这么大了第一次听说约束还能“执行”?!!
      

  19.   

    建表的时候就可以把关系如约束建上去.
    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  )
    )