C# 创建外键的危险。nHibernate与sqlserver

C# 创建外键的危险。nHibernate与sqlserver,c#,sql-server,nhibernate,C#,Sql Server,Nhibernate,我继承了一个旧的破旧数据库,并希望在现有的关系列中加载外键,这样我就可以在关系中使用nHibernate之类的东西 我在密钥领域有点缺乏经验,虽然我觉得我理解它们是如何工作的,但我的某些部分很害怕,或者不知何故破坏了数据库 例如,我遇到了“删除时级联”的概念。我认为目前数据库中没有外键,所以我想这不会影响我。。。但是我怎样才能确定呢 我还需要注意哪些其他风险 在某种程度上,我希望只使用nHibernate而不使用外键,但从我看来,这是不可能的?nHibernate不要求在要使用的数据库上存在外键

我继承了一个旧的破旧数据库,并希望在现有的关系列中加载外键,这样我就可以在关系中使用nHibernate之类的东西

我在密钥领域有点缺乏经验,虽然我觉得我理解它们是如何工作的,但我的某些部分很害怕,或者不知何故破坏了数据库

例如,我遇到了“删除时级联”的概念。我认为目前数据库中没有外键,所以我想这不会影响我。。。但是我怎样才能确定呢

我还需要注意哪些其他风险


在某种程度上,我希望只使用nHibernate而不使用外键,但从我看来,这是不可能的?

nHibernate不要求在要使用的数据库上存在外键,但是,我仍然建议尽可能添加外键,因为外键是一件好事,它们可以确保数据库的引用完整性

例如,如果我的数据库中有一个
用户
和一个
注释
表,并且我要删除碰巧有两条注释的用户1,没有外键,那么我现在有两条注释,没有所有者!我们显然不希望这种情况发生

这就是外键的作用,通过声明
User
Comment
表中的外键,我们的数据库服务器将确保我们不能删除用户,除非没有与他或她相关的注释(不再)

将外键引入数据库是一件好事。它将公开现有的无效数据。它将保持现有的有效数据,有效。您可能必须对已经失控的表执行一些数据操作(即,创建“未知用户”或类似对象,并更新所有不存在的键以指向它,这是需要在检查数据含义后做出的决定)

如果一个现有的应用程序没有删除它应该做的所有数据(比如在我的示例中没有删除所有的注释),它甚至可能在一开始会导致一些问题,其中一个现有的应用程序会崩溃。但从长远来看,这是一件好事,因为它会暴露出问题所在,并允许您修复这些问题,同时不会使数据和数据库陷入更糟糕的状态


与外键分开,是NHibernate允许您在删除父对象时确保删除所有子对象的方式。例如,这允许您确保对数据模型所做的任何更改都不会违反外键关系(这将导致数据库异常,并且不会应用任何更改)。就我个人而言,我更愿意自己处理这个问题,但这取决于你是否以及如何使用它们

将外键放在设计时没有外键的数据库上的最大问题(这表明原始数据库设计者不称职,因此还有许多其他问题需要解决)是,有接近100%的可能性存在没有父键的孤立数据。您需要弄清楚如何处理这些数据。其中一些可以扔掉,因为它不再以任何方式可用,只是在浪费空间。但是,如果其中任何一项与订单或任何财务相关,您需要保留数据,在这种情况下,您可能需要定义一个“未知”的父记录,您可以将这些记录与之关联。首先查找并修复所有错误数据,然后添加外键


谨慎使用级联更新和级联删除,因为如果需要更改大量记录,它们会锁定数据库。此外,在许多情况下,如果存在现有记录,您希望删除失败。例如,您不希望通过财务记录进行级联删除。如果删除用户会删除过去的订单,那是一件非常糟糕的事情!如果不使用级联,很可能会遇到错误代码,当密钥就位后无法再删除或更改记录时,这些错误代码会使数据变糟。所以,一旦你有了密钥,就要彻底测试所有的删除和更新功能

外键将规范化数据库中的关系形式化。您正在讨论的外键约束可以防止创建重复的键或删除定义仍在使用或引用的实体的字段。这被称为“参照完整性”

我建议使用某种建模工具来绘制所谓的ERM或实体关系模型图。这将帮助您了解数据的存储方式以及更改的有用位置

之后,你应该考虑数据是否合理(比如说第二或第三范式)。规范化程度。请特别注意具有主键的每个实体,以及数据对键的完整描述。您还应尝试删除冗余并将非原子字段拆分为一个新表。“每个非键属性必须提供有关键、整个键以及除键以外的任何内容,以便帮助您进行Codd。“如果您发现数据没有规范化,那么在适当的情况下,这将是修复任何严重的结构问题和/或重构的好时机


此时,添加外键和约束是本末倒置。在尝试保护数据之前,请确保数据完整性。您首先需要做一些准备工作,然后约束将使您不那么破旧的新重新构建的数据库保持最佳状态。这些约束将确保没有人决定对将数据弄得一团糟的规则进行例外。现在就花点时间把数据整理得井井有条,之后再把门锁上。

外键是你的朋友。它们保护您数据的完整性。您不能