当我们可能需要先保存从属数据时该怎么办

时间:2008-12-04 18:17:44

标签: database database-design

在一对多关系中,处理数据的最佳方式是,它足够灵活,用户可以在保存主表数据之前保存从数据。

  • 保留主服务器的行ID,以便我可以使用保留的主服务器
  • 保存de slave数据
  • 将从属数据保存在临时表中,这样当我们保存主数据时,我们可以“导入”临时表中的数据
  • 其他??

票证/上传多个文件表单中的示例,用户可以在发送票证信息之前上传文件:

主表 PK 门票说明

奴隶表 PK Master_FK 文件

4 个答案:

答案 0 :(得分:2)

你的id是自动生成的吗?

您可以选择几种可能存在的问题。

首先不要定义FK关系。现在,您如何解释部分状态下的记录以及那些从未结婚到真实记录的记录?当插入主记录时,您打算如何结合记录?

首先将记录插入主表,除了id之外,所有内容都是空白的。这使得所有必需的字段都默认为用户应用程序,从数据完整性的角度来看,我并不陌生。

第三个也是最复杂但可能最安全的 - 使用3个表。在仅包含主记录ID的表中创建主记录,并在打开表单时将其返回给应用程序以创建新记录。创建与原始主表和外键表的pk / fk关系。从原始主表中删除id的自动生成,并在插入记录时插入新主表中的id。在将记录插入原始FK表时插入新的主表id。至少这样,您可以继续将所有必需字段标记为数据库中的必需字段,但关系是新表与另一个表之间的关系,而不是原始表和另一个表。这不会影响查询(只要你有正确的索引),但是如果删除记录会使事情变得更复杂,因为如果你不小心,可能会留下一些问题。此外,您还必须考虑是否有其他进程(例如来自其他来源的数据导入)可能会将记录插入主表,而这些进程必须进行调整,因为不再自动生成id。

答案 1 :(得分:1)

在Oracle(也许是其他人?)中,您可以将约束的验证推迟到COMMIT时间。

所以你可以先插入子行。 (显然你需要父键。)

答案 2 :(得分:0)

为什么不能创建主行并将其标记为不完整?

答案 3 :(得分:0)

如果是上传,您必须为未提交的上传创建临时存储空间。因此,一旦上传开始,您将所有新文件保存在单独的表中。一旦用户准备好提交票证,您就可以保存票证并从临时表中附加文件。

如果主表中有一些固定的id,你也可以创建假记录。然后,您必须确保假记录不会出现在其他地方的查询中。

第三,您可以创建存储过程,该存储过程将为主表和增量标识计数器生成id。如果用户中止操作,保留的id不会影响任何内容。就像你创建主记录然后删除它一样。您也可以在主表中创建临时记录。