什么是正确的文件设计

时间:2013-09-24 18:49:49

标签: ravendb

首先是一个警告:我对文档数据库完全陌生,所以我的所有“理解”都来自文档和博客文章,这是我的第一次实践工作。

我想实现以下目标:

  1. 存储不同类型的文档并管理文档周围的一些元数据。
  2. 通过以下方式查询数据库:
    • 元数据
    • 元数据和文档属性
    • 特定文档类型的元数据
  3. 更新元数据,而无需加载整个文档。
  4. 我的理解是我在这里有两个选择。

    将元数据与文档一起保存。

    public class Metadata
    {
        public DateTime ValidFrom { get; set;}
        public DateTime? ValidTo { get; set;}
    }
    
    public class DocumentWithMetadata<T>
    {
        public T Document { get; set;}
        public Metadata Metadata { get; set;}
    }
    

    拥有一个包含元数据属性的索引,并使用LiveProjections加载文档的元数据而不加载整个文档。有关元数据的更新,请使用PATCH。根据文档..."is considered to be an expert feature and generally should not be used as a general purpose solution. If you have reached a scenario where you are considering using this, you might want to recheck your data model and see if it can be optimized to prevent usage of the Patching API"

    另一种选择是将元数据保存为独立文档。

    public class Metadata
    {
        public DateTime ValidFrom { get; set;}
        public DateTime? ValidTo { get; set;}
    }
    
    public class DocumentWithMetadata<T>
    {
        public T Document { get; set;}
        public string MetadataId { get; set;}
    }
    

    在这种方法中,我可以使用Related Document Indexing功能并将元数据属性“提升”到文档的索引中。

    鉴于对于T1类型的文档,Raven将创建一个名为DocumentWithMetadataOfT1的集合,如果所有元数据都在一个文档中,如何查询获取T1文档的元数据集合?

    我想过其他一些方法,例如向元数据添加文档类型属性或反转关系,但所有这些方法看起来都像黑客一样。

    必须有更好的方式......或不是吗?

1 个答案:

答案 0 :(得分:1)

你实际上想要做的事情让人很困惑。主要是因为Raven已经拥有了自己的文档和元数据概念,并且由于某些原因你引入了自己的概念。

根据您要添加到元数据的ValidFromValidTo字段,我的猜测是您正在尝试某种双时效或“历史表”。这实际上已经完成了,所以如果那就是你的目标,那么你应该使用我的Temporal Versioning Bundle