我正在考虑将RavenDb用于我们公司正在进行的新项目。 该项目将包含具有一组动态属性的实体,这些属性基于用户可能附加到它们的标签。
示例:
名为Image的实体有:
我们希望使用标签(系统中的另一个实体)来允许用户为图像创建特定属性。 标签由名称组成,可能有父标签。
如果用户创建了两个标签:
House标签具有以下属性:
Car标签具有以下属性:
(这些标签和属性必须由用户在我们的应用程序中使用特殊编辑屏幕进行管理。)
当用户随后创建图像并为该图像指定特定标签时,该图像上的所有属性必须出现在新图像上。 可以有多个标签附加到一个图像。应单独查询标签,以便在GUI中显示它们。
我的问题是:
我知道如何在SQL中执行此操作。但是当有可能有300000个具有各种属性的图像时,我有点担心性能。特别是当我们想要搜索那些属性时。 对于这种设置,任何人都可以给我一个快速启动(或已经存在的教程)吗?我不确定如何为这类数据建模我的实体。
日Thnx!
答案 0 :(得分: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。