【问题标题】:RavenDB document structure vs relational schemaRavenDB 文档结构与关系模式
【发布时间】:2012-11-15 10:13:33
【问题描述】:

我最近开始使用 RavenDB。

这是关系数据库中的一个传统示例:

员工类型

ID:1 类型:DEV ID:2 类型:QA

员工

姓名:FRED 类型 ID:1
姓名:杰克 TYPEID:2

根据我对 RavenDB 的了解,该类型将包含在员工中:

员工

姓名:FRED 类型:DEV
姓名:杰克类型:QA

那么是否需要 EmployeeType 表?

如果不是,如果你要显示一个员工类型的下拉列表,你会选择 distinct(Type) from Employee 吗?

如果您要执行上述操作,您将如何在不输入新员工(或编辑现有员工)的情况下添加新员工类型?或者你会在代码中的某个地方保留一个列表吗?

最后,如果更改了员工类型的文本,您似乎需要更新所有员工记录。如果有 100,000 条员工记录怎么办?

我是 Raven(文档数据库)的新手,因此任何有助于我更好地掌握不同范式的见解将不胜感激。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    那么是否需要 EmployeeType 表?

    将满足下一个问题的要求。此外,这种类型的参考数据可以只存储在单个文档中,而不是文档集合中。您还可以维护一个硬编码列表,一起绕过数据库。

    如果不是,如果您要显示员工类型的下拉列表, 你会从 Employee 中选择 distinct(Type) 吗?

    没有。从员工类型文档中选择。从员工表中选择不同的选项会告诉您记录的员工类型,而不是可用的员工类型。

    最后,如果更改了员工类型的文本,似乎 就像您需要更新所有员工记录一样。如果 有 100,000 条员工记录?

    您面临的是关系数据库和文档数据库之间的有效权衡。你有几个选择。您可以通过指向员工类型文档集合的 ID 从员工文档中引用员工类型。这样,您可以在一处更改员工类型名称。但是,权衡是 RavenDB 将需要包含(连接)这两个文档以返回具有类型的员工。另一种方法是避免使用员工类型 ID 并将类型直接存储在员工文档中,当需要更改名称时,您将在所有文档中运行更新。查看 RavenDB 文档中的 here

    【讨论】:

    • 不错的答案。这确实是我对可以用户定义的查找类型采取的方法。但是,许多类型都是硬编码的——我会为此使用 Enum 而完全忘记将其保存在数据库中。只需在 Employee 上放置一个 EmployeeType 枚举属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2012-03-17
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多