gpt4 book ai didi

c# - 使用 C# 和 RavenDB 的自定义字段设计

转载 作者:太空狗 更新时间:2023-10-29 19:47:04 24 4
gpt4 key购买 nike

我面临一个关键的设计问题,即如何将自定义字段附加到我系统中的实体。这些实体在 C# 中表示并持久保存在 RavenDB 中。我们大致遵循领域驱动设计的租户,我们的实体是聚合根。

[注意:我想避免围绕 DDD 方法中自定义字段等通用功能的适当性进行任何争论。假设我们有合法用户需要将任意数据附加和显示到我们的实体。此外,我已将我的示例通用化以说明设计挑战。 :)]

我的问题是关于如何最好地布置字段定义和字段值实例。

想象一个域,我们在其中拥有 Book 和 Author 的聚合根。我们希望用户能够将任意数据属性附加到 Books 和 Authors 的实例。因此,我们可以使用这样的类定义一个自定义字段:

public enum CustomFieldType
{
Text,
Numeric,
DateTime,
SingleSelect,
MultiSelect
}

public class CustomFieldDefinition
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public CustomFieldType Type { get; set; }
public Collection<string> Options { get; set; }
}

附加到 Book 的 CustomFieldDefinition (CFD) 可能具有如下值:

  • Id: "BookCustomField\1"
  • 姓名:“FooCode”
  • 类型:文本
  • 描述:“Foo Corp 的特殊标识符。”
  • 类型:文本
  • 选项: null

我面临的第一个问题是在 Book 的每个实例上存储什么。选择范围从...

低端:

仅存储 CFD Id 和实例值

高端:

将整个差价合约连同值(value)一起存储

“低端”很糟糕,因为我无法在不引入 CFD 的情况下显示书籍,而 CFD 位于另一个文档中。此外,如果我以任何方式更改 CFD,我就会更改历史文档中值的含义。

“高端”不好,因为会有很多重复。 CFD 对于选择列表 CFD 来说可能非常繁重,因为定义包含所有可选择的选项。

第一个问题是……每本书的文档中应该存储多少?刚好足以显示这本书(而且我必须返回 CFD 来显示选项和说明(如果我要允许用户编辑 CF 值)?

第二个问题是……我应该将一种实体类型的整个 CFD 集合存储在一个文档中,还是将每个 CFD 保存在它自己的文档中? enter image description here

作为文档的每个 CFD 使每个 CFD 的事情变得简单(尤其是当我开始做诸如停用定义之类的事情时),但是我需要一种方法来将书籍 CFD 与作者 CFD 分开。每当我想编辑实体时,这也迫使我为附加到实体的每个 CF 加载 1 个文档。

一个文档中给定类型的所有 CFD 允许我只加载一个文档,但随后我还要加载所有已停用的定义。

第三个问题...是否有更好的方法来实现这一点?

第四个问题...是否有任何示例或开源解决方案,这样我就不必重新发明这个轮子?

最佳答案

既然你在评论中说:

... a Book from a year ago should show the custom fields as of a year ago.

我只能看到两个可行的选择。

选项1

  • 自定义字段定义存在于他们自己的文档中。
  • 每本书都包含适用于该书的自定义字段定义的副本,以及为每个自定义字段选择的值。
  • 它们在首次创建书籍时被复制,但可以根据您的逻辑再次复制。也许在编辑时,您可能想要复制一份新副本,这可能会使当前选择无效。
  • 优点:自包含,易于索引和操作。
  • 缺点:自定义字段定义的大量副本。存储需求可能非常大。

选项 2

  • 使用Temporal Versioning Bundle (免责声明:我是它的作者)。
  • 自定义字段定义仍然存在于他们自己的文档中,但会暂时进行跟踪。这意味着对自定义字段的修订将保留在可用的历史记录中。
  • 书籍仅包含选定的值。它们不包含定义的副本。
  • 书籍不需要临时跟踪,但它们确实需要数据中的某种有效日期。也许是“输入日期”。使用对您有意义的任何东西。
  • Book-to-CFD 关系是 Nt:Tx 类型。您可以找到此关系类型的另一个示例 here .您可能想要了解 temporal relationships 的概览为了弄清楚这一点。请注意,这是一个棘手的主题,很快就会变得复杂。
  • 优点:所需的存储空间少得多,因为自定义字段定义数据的重复副本不多。
  • 缺点:学习曲线。使用时态数据的复杂性。在您的数据库服务器上安装自定义包的要求。

使用任一个选项,我会简单地在自定义字段定义上保留一个属性,说明它适用于什么类型(书籍、作者等)。

关于c# - 使用 C# 和 RavenDB 的自定义字段设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17623343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com