数据完整性 (50分)

  • 主题发起人 主题发起人 LanzeServer
  • 开始时间 开始时间
L

LanzeServer

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟如下问题:
如有货品A001,在销售单中引用了此货品ID,显示为货品名称(LOOKUP)在采购单也引用上此货品ID。此时A001不能删除
我在货品结构中增加了引用次数,调用时增加引用次数。我想有没有更好的解决方法
 
你使用的dbms如果是SQL之类的可以定义外键让DBMS来管理这些问题。
 
对,如果是SQL Server/Oracle之类,就可以让数据库来完成
 
不要用“引用次数”字段,因为如果程序出了问题,很可能这个值就会不正确,货品名称
之类的数据应该是基本数据,不应该在采购、销售程序中维护,而应该在专门的模块中维
护,在这个模块在删除一个货品时应先确定此货品没有被引用,这种情况采用外键的方式
比较好。

顺便说一下,外键用多了很不方便,我现在就是:
主 从 关系 主键
TableA -> TableB 一对多 TableB 在 TableA 基础上增加了字段,
TableB -> TableC 一对多 TableC 在 TableB 基础上增加了字段

操作中,用户要修改 TableA 表记录的主键字段值(输入时选错了),麻烦大了,只有
先记录下 TableC 、 TableB 的记录,再删除,再修改 TableA 的数据,再恢复 TableB、
TableC 的记录,太麻烦了,最后还是把外键删了。

我认为,在MIS开发中,外键的作用不大,只是在PD设计中可用直观地表述表之间的关系,
其数据一致性的工作大多还是由程序来维护的,因为我们不可能用DBMS出错的方式来提示
用户数据上的问题,应该尽量保证发往DBMS的操作是正确的,这样DBMS提供的一些功能,
诸如外键,充其量只能做辅助维护的工作,因为如果程序做的好,是不会触发DBMS的错误
的,这些DBMS的功能应该是空闲着才对,而滥用外键,反而会使程序变的复杂,就我上面
的例子,程序上就会控制好,不会出现插入外键以外的值,在修改、删除操作时,在事务
中来维护数据之间的关系,这样可以避免出现用户无法理解的DBMS返回的错误。

外键的使用应该视情况而定,你这种情况,用外键是应该的。

----个人看法,欢迎指正!
 

TO:DIRK。货品名称我确实是在另外之处维护,在销售单中只是调用货品的ID,显示货名称。采用的
的LOOKP。如有货品A001 ,ID为1。 在销售单中定义了外键。按LOOKUP原理,根据ID,显示货品名称
A001。如果在货品资料中不做限制删除的话,此时在销售单显示时就会出错。你说采用外键维护,怎么做。能举一个例子吗
 
我上面的问题不是主从关系。dirk 对于主键,我另外建一个字段,这个字段是不会让用户修改的,自己在程序控制。用户
自己国录入的数据让他随意的修改也不关系到主键
随便说一下,采用LOOKUP调基本资料,如我在基本资料修改数据。在所有的单据同时也修改了数据,它们这一点好处
 
你用过powerdesign吗?用它设计数据库结构非常方便,建立外键也很方便,拖一下就可以
了,还帮你生成SQL语句,

外键怎么说呢?TableA有字段:id、name,其中id为主键,TableB有字段:id、……,设
置TableA的id字段为TableB字段id的外键,并设置该外键的约束规则为更新、插入、删除
操作,那么,当你要在TableB中插入记录,其中id字段的值必须存在于TableA中,当你要
删除TableA的记录时,如果有任一受该外键约束的表中存在id的记录,将无法删除该记录,
更新也是,这个你看看数据库原理就知道了!

这样你把销售单表的物品id字段做为货品表的外键,这样只要销售单表中存在某个货品,
那么都无法删除货品表中该货品的记录,这是DBMS替你维护的!
 
接受答案了.
 
后退
顶部