如何在SQL Server中正确地将自动填充的表与手动填充的表分开?

时间:2009-03-25 15:51:59

标签: sql-server database database-design sql-server-2008

假设我在数据库中有以下两个表:

[Movies] (Scheme: Automatic)
----------------------------
MovieID
Name

[Comments] (Scheme: Manual)
----------------------------
CommentID
MovieID
Text

“电影”表每10分钟由服务更新一次,“评论”表由数据库用户手动更新。

通常你只是在两个表之间用级联更新和删除创建一个简单的外键关系,但在这种情况下,我希望能够保留手动输入的数据,即使它引用的电影被删除(更新服务不是那么可靠)。这应该只是从自动表到手动表的一对多关系中的问题。您如何分离手册和数据库中自动填充的部分?

我计划添加一个不保持参照完整性的外键,只是级联更新,而不是删除。但这样做有什么陷阱我应该注意到吗?我的意思是,除了我可能最终得到一些实际上没有引用任何内容的手动数据这一事实。

编辑/澄清:

只是澄清一下。示例表完全组成。实际上,DB将包含服务器,应用程序,应用程序注释,版本号等对象。服务器相关信息将自动填充,但某些应用程序详细信息将手动填写。它可能是特殊配置等信息。即使服务器记录被删除,该服务器上的应用程序注释仍然有价值,不应删除。

4 个答案:

答案 0 :(得分:3)

我建议您使用由服务更新的导入表,然后从中填充电影表。然后你可以保留电影表中删除的电影。可能将它们标记为已删除或已过时,但您仍然可以将它们保留为历史目的。

答案 1 :(得分:1)

我认为您应该对该方案使用软删除。我不认为你想要评论你不知道他们属于哪部电影。

答案 2 :(得分:1)

同意;一个示例路由是复制电影表并添加一个状态字段,指示每个记录的当前状态(实时/检查/删除)。然后,自动导入应该进入临时表,将所有电影的状态设置为“检查”,然后使用临时表更新真实电影表,将电影状态设置为在临时表中找到时生效。完成后,将任何仍处于“检查”状态的电影设置为已删除,因为在自动导入中找不到它们。在应用程序端,选择任何没有status = deleted的电影。

答案 3 :(得分:1)

  

“我打算添加一个外键   这不是维持参考   完整性和只有级联更新,   不删除。“

由于您似乎正在使用代理键,因此更新与外来元素无关。另外,既然你不关心孤立数据,那么为什么要使用引用约束呢?您可以使用约束来确保存在某些内容,在这种情况下您似乎不需要这些内容。