RavenDB中的关系型数据库删除概念

4

我对Raven DB和No SQL数据库的概念都很陌生。我试图摆脱关系型数据库的某些概念。其中一个概念是,如果某个记录被用作外键,那么关系型数据库将不允许我删除主记录。

假设我想要删除一个类别(Category),并且该类别的ID在某个产品(Product)中被使用,那么关系型数据库将不允许我删除该记录。这非常有帮助,因为这样我就不必担心意外删除记录。如何在 Raven DB 中应用相同的概念?我想使用像关系型数据库一样的规范结构,因为我计划将Raven DB与某些关系型数据库一起使用。我希望不会因为尝试一种新概念而陷入混乱,所以想要安全第一。

希望我的问题表述清楚了,

非常感谢您的任何帮助!

1个回答

4
在RavenDB中,不存在所谓的“外键约束”概念。实际上,也没有“外键”。你在文档中只有一个可以用来获取另一个文档的字符串。我们称之为关系,但这是一个宽泛的术语。在引擎下面没有任何东西将这些文档链接在一起并防止您进行删除操作。
在您描述的情况下,您仍然可以加载产品。但是,如果您尝试使用该产品的类别ID加载类别,则会得到null。
您必须自己维护这些关系。唯一可用的助手是Cascade Delete Bundle,但您仍然必须为每个实体连接级联。它不像基于SQL外键的级联删除那样自动执行。

谢谢你的回复,马特。 难道没有任何方法,或者可能有一个捆绑包来应用这种类型的行为吗?我是在寻求一些在基于文档的数据库中不适用的东西吗?我想要了解的是,我的关注点在关系型数据库世界中是有效的,在No SQL世界中是否仍然有效?如果不是,那么在No SQL数据库中存储类别和产品等常见实体的解决方案是什么? - Afraz Ali
你可以按照你所描述的方式存储它们。只是你没有数据库来帮助执行关系约束。是的,可以编写一个bundle来添加这个行为,但目前还不存在。很多人想要它,但也有很多人认为它是一种支撑,而且可能会影响性能。必须谨慎应用。我有编写Raven bundles的经验。我会再深入思考一下。 - Matt Johnson-Pint
使用Raven,您不需要拥有规范化的结构才能与关系型数据库一起使用。这样做会让您失去RavenDB的很多好处。尝试了解SQL复制以及它如何帮助您。 - Felipe Leusin
我会把Matt Johnson的回答作为答案,因为他详细阐述了RavenDB与SQL Server的区别以及应该采取哪些方法。我很高兴能够了解人们如何使用RavenDB处理类似的情况。 - Afraz Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接