【问题标题】:RavenDB model questionsRavenDB 模型问题
【发布时间】:2013-03-12 07:46:42
【问题描述】:

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

例子:

名为 Image 的实体有:

  • 身份证
  • 姓名
  • 尺寸

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

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

  • 房子
  • 汽车

房屋标签具有以下属性:

  • 位置
  • 颜色
  • 尺寸

汽车标签具有以下属性:

  • 品牌
  • 颜色
  • 引擎类型
  • 门总数

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

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

我的问题是:

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

谢谢!

【问题讨论】:

  • 我不太清楚您的关注/问题。您目前正在分别存储带有属性的图像和标签?图像只有一个标签的引用,您担心“加入”超过 30 万张图像?

标签: database nosql ravendb


【解决方案1】:

不太清楚您所说的“应单独查询标签以便在 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}
            }
        }
    }
};

这最终会在 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

【讨论】:

  • 感谢您的广泛回答!我不想保存每个标签的属性,但附加到图像的标签组合定义了应用于图像的属性。你的代码示例给了我一个明确的方向。
猜你喜欢
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多