2013-03-09 64 views
0

我正在考虑将RavenDb用于我们公司正在进行的新项目。 该项目将由具有基于用户可能附加到它们的标签的一组动态属性的实体组成。RavenDB模型问题

例子:

实体,称为图像上有:

  • 编号
  • 名称
  • 尺寸

我们要使用标签(在系统中只是一个实体)来允许用户为图像创建特定的属性。 标签由一个名称组成,并可能有一个父标签。

如果用户创建了两个标签:

众议院标签具有以下属性:

  • 位置
  • 颜色
  • 大小

汽车标签具有以下属性:

  • 品牌
  • 颜色
  • 发动机类型
  • 总门

(这些标签和属性必须是由用户通过我们的应用程序中的特殊编辑屏幕进行管理)。

当用户创建图像并为该图像分配特定标签时,该标签中的所有属性都必须出现在新图像上。 可以将多个标签附加到一个图像。应该单独查询标签以便在GUI中显示它们。

我的问题是:

我知道如何在SQL做到这一点。但是,当可能有30万张具有各种属性的图像时,我对此表现有点担忧。特别是当我们想要搜索这些属性时。 任何人都可以给我一个跳跃开始(或已有的教程)这种设置?我不确定如何为这类数据建模实体。

Thnx!

+0

我并不十分清楚你的担忧/问题。您当前正在分别存储带有属性的图像和标签?该图片仅提及一个标签,您担心要“加入”超过30万张图片? – ryan1234 2013-03-11 22:43:53

回答

0

不太清楚你的意思是“应该单独查询标签以便在GUI中显示它们。”但是每个图像的文档都是直接存储每个标签的属性的起点。

E.g.

public class Image 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public Dictionary<string, Dictionary<string, object>> LabelProperties { get; set; } 
    } 

然后,您可以填写此如下:

var img1 = new Image 
{ 
    Name = "Image1", 
    LabelProperties = new Dictionary<string, Dictionary<string, object>> 
    { 
     { 
      "Car", 
      new Dictionary<string, object> 
      { 
       { "Brand", "GM"}, 
       { "Color", "Blue"}, 
       { "Engine type", "Big"}, 
       { "Total doors", 4} 
      } 
     }, 
     { 
      "House", 
      new Dictionary<string, object> 
      { 
       { "Location", "Downtown"}, 
       { "Color", "Blue"}, 
       { "Size", 240} 
      } 
     } 
    } 
}; 

这就结束了在DB看上去很漂亮的结构JSON:

{ 
    "Name": "Image1", 
    "LabelProperties": { 
    "Car": { 
     "Brand": "GM", 
     "Color": "Blue", 
     "Engine type": "Big", 
     "Total doors": 4 
    }, 
    "House": { 
     "Location": "Downtown", 
     "Color": "Blue", 
     "Size": 240 
    } 
    } 
} 

然后,您可以查询这个使用动态指标。例如。查找包含一个蓝色的房子所有图片:

var blueHouses = session.Query<Image>() 
.Customize(x => x.WaitForNonStaleResults()) 
.Where(x => Equals(x.LabelProperties["House"]["Color"], "Blue")); 

Console.WriteLine("--- All Images Containing a House of Color Blue"); 
foreach (var item in blueHouses) 
{ 
    Console.WriteLine("{0} | {1}", item.Id, item.Name); 
} 

如果你想对自己的索引可能需要标签查询。完整的例子见the gist

+0

感谢您的广泛答复!我不想保存每个标签的属性,但是附加到图像的标签组合定义了应用于图像的属性。你的代码示例给了我一个清晰的方向。 – 2013-03-12 08:21:57