【问题标题】:Relational Database Delete Concept in RavenDBRavenDB 中的关系数据库删除概念
【发布时间】:2013-01-12 00:05:49
【问题描述】:

我是 Raven DB 的新手,也是 No SQL DB 概念的新手。我试图摆脱 RDB 附带的一些概念。曾经的概念是,如果某个记录在某处用作外键,RDB 不会让我删除主记录。

假设我不想删除一个类别并且该类别的 ID 正在某个产品中使用,那么 RDB 不会让我删除该记录。这很有帮助,因为我不必担心意外删除记录。如何将相同的概念应用于 Raven DB?我想使用像 RDB 这样的规范化结构,因为我计划将 Raven DB 与一些 RDB 结合使用。我希望以防万一,以免因尝试新概念而陷入混乱。

希望我说得有道理,

任何帮助将不胜感激!

【问题讨论】:

    标签: nosql ravendb


    【解决方案1】:

    RavenDB 中没有外键约束这样的概念。真的,没有外键。您的文档中只有一个字符串,可用于获取另一个文档。我们称之为关系,但这是一个宽松的术语。内部没有任何事情可以将这些文档链接在一起并阻止您进行删除。

    在您描述的场景中,您仍然可以加载产品。但是,如果您尝试使用该产品的类别 ID 加载类别,则会得到 null。

    您必须自己维护这些关系。唯一可用的助手是Cascade Delete Bundle - 但您仍然必须连接每个实体以进行级联。它不会像使用基于 sql 外键的级联删除那样自动执行此操作。

    【讨论】:

    • 感谢您的回复马特,有没有办法,也许捆绑应用这种行为?我是否要求一些不适用于基于文档的数据库的东西?我想了解的是我的担忧在 RDBM 世界中是否有效,在无 SQL 世界中是否仍然有效?如果不是,在无 SQL 数据库中存储常见实体(如类别和产品)的解决方案是什么?
    • 您可以完全按照您的描述存储它们。您只是没有代表您执行关系约束的数据库。是的,可以编写一个包来添加这种行为,但它现在不存在。许多人会喜欢它,但许多人会将其视为拐杖,并且可能会对性能产生影响。它必须谨慎应用。我有编写 Raven 包的经验。我会更深入地思考一下。
    • 有了 Raven,你不需要一个规范化的结构就可以使用 RDB。这样做,您将失去 RavenDB 的大部分优点。尝试阅读 SQL 复制以及这对您有何帮助。
    • 我会以 Matt Johnson 的回复作为答案,因为他已经详细说明了 RavenDB 与 SQL Server 的不同之处以及应该采取哪些行。我很高兴了解人们如何使用 RavenDB 处理类似情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2020-12-11
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多