0

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

例子:

名为 Image 的实体具有:

  • ID
  • 姓名
  • 尺寸

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

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

  • 房子

House 标签具有以下属性:

  • 地点
  • 颜色
  • 尺寸

Car 标签具有以下属性:

  • 颜色
  • 引擎种类
  • 总门数

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

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

我的问题是:

我知道如何在 SQL 中做到这一点。但是当可能有 300000 张具有各种属性的图像时,我有点担心性能。特别是当我们想要搜索这些属性时。任何人都可以为这种设置提供一个快速入门(或现有的教程)吗?我不确定如何为此类数据建模我的实体。

谢谢!

4

1 回答 1

0

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

例如

    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}
            }
        }
    }
};

然后,这最终在数据库中看起来非常漂亮的结构 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);
}

如果您想查询标签本身,则可能需要索引。有关完整示例,请参阅要点

于 2013-03-11T23:46:42.073 回答