日期:2014-05-18  浏览次数:20467 次

邮件表与附件表设计的困惑
因为在实际情况中存在邮件附件这样的情况,所以用了这个标题

困惑描述:
一个邮件可以有很多附件,但是在写邮件的时候,用户可能先上传了一些附件,但是之后又不写邮件了,这样就产生了两个垃圾附件。

以前我在oracle下是这样设计的,去掉邮件抄送和多人共享附件简化后是
邮件表
emailid
title
..
附件表
id
emailid
....
其中附件表中的emailid不是外键。

由于oracle有sequence(序列)功能(相当于自增ID,但是与表是分离的)我可以先取一个主键ID,设先用户是先上传附件。那么我可以把这个预先取的id插入emailid。然后如果用户又写了邮件,我可以把这个ID作为邮件表的主键来用。以后系统自动清理附件表中emailid在邮件表没对应值的记录。


但是在sqlserver下面我无法实现这个功能。因为自增ID要在邮件表插入记录后,才能取得。如果用户是先上传附件,那么附件表中的emailid就没有办法生成了。

当然我可以先在邮件表中插一件空记录,并标记为未生效,然后再把这个主键给附件表用。这样如果用户上传了附件之后不写邮件了,那就在两个表里生成了垃圾。
而且这会造成需要记录操作状态。不然如果用户点了下“增加附件”,然后关闭,又点了下“增加附件”。就会有两个垃圾记录




------解决方案--------------------
不知道你的页面是什么样子的,可不可以这样呢?

点击增加附件后,把相关的参数传递给父页面,然后再和邮件一起插入数据库
------解决方案--------------------
把两个对表的操作过程,放在一个存储过程中.如果两个表都插入数据,才真正提交数据库.就可以解决这个问题...用事物,把两个操作放在事物中.有一个插入失败,回滚事物....
------解决方案--------------------
不太理解楼主的思路是什么

如果你不提交邮件,也就是你保存邮件的话,那附件怎么保存呢
正常情况下,应该奖两个动作一起来执行,利用事务的功能来控制动作执行的完整性

------解决方案--------------------
你添加附件的时候,在程序里面执行,当确定的时候再用事务添加到数据库
------解决方案--------------------
垃圾附件定期处理吧~