2013-09-24 98 views
0

首先是一个警告:我对文档数据库是全新的,因此我所有的“理解”都来自文档和博客文章,这是我第一次亲身实践。什么是正确的文档设计

我要实现以下目标:

  1. 存储不同类型的文件和管理围绕文件的一些元数据。
  2. 查询数据库由:
    • 元数据
    • 元数据和文件属性
    • 元数据为特定文档类型
  3. 更新元数据,而无需加载整个文件。

我的理解是我在这里有两个选择。

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

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类型的文档乌鸦会创建一个名为DocumentWithMetadataOfT1集合,我将如何查询为T1文件元数据,如果所有的元数据是一个集?

我想过其他一些方法,比如向元数据添加文档类型属性或者反转关系,但是它们都像是黑客。

必须有更好的方法..或不?

回答

1

这实在令人困惑,你实际上想做的事情。主要是因为Raven已经拥有自己的文档和元数据概念,并且出于某种原因您正在介绍自己的概念。

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

+0

感谢马特,正如我所提到的,我总的来说是一个RavenDB和文档数据库的初学者,所以有很多东西需要学习。作为一个学习项目,我想实现[缓慢改变类型2的维度](http://en.wikipedia.org/wiki/Slowly_changing_dimension)。我将在今晚看看Temporal Versioning Bundle。 时间版本控制软件包可以通过自定义“跟踪字段”进行扩展吗?例如谁做了改变的用过的ID? – Nafas

+0

这是一个先进的概念。我的建议是从简单的RavenDB开始,并习惯于首先记录数据库模式。一旦你不再考虑关系数据库的思维方式,那么看看暂时版本控制,它对你来说会更有意义。是的,你可以扩展它,但你不需要做任何特别的事情。只需简单地存储其他数据或元数据字段,并且它们将被适当地版本化。关于SCD第2类 - 是的,这是一个类似的概念,但更多的是OLAP术语。 –

+0

我们正在处理每日数据转储。这些文件是其他系统中所有数据的快照。这些文件包含高达300K的记录,其中变化率非常小,最坏的情况下大约为1% - 1.5%。我只想使用校验和来捕获已更改的文档(转储文件中的行)以检测更改。我正在研究文档数据库的原因是,我不必为每个需要处理的〜20个转储处理数据库模式。 – Nafas

相关问题