2

我正在建立一个带有用户数据库的站点。我正在使用arbor.js为每个用户构建一个图表。该图是一个带有边缘和节点的树状结构,看起来像这样(我准备好了一张图像,但显然还没有足够的声誉):

             vehicle
             /     \
            /       \
          car      truck
          /
         /
       sedan

并由以下 JSON 表示:

{
   "nodes":{
      "vehicle":{
         "color":"black",
         "label":"vehicle"
      },
      "car":{
         "color":"orange",
         "label":"car"
      },
      "truck":{
         "color":"red",
         "label":"truck"
      },
      "sedan":{
         "color":"red",
         "label":"sedan"
      }
   },
   "edges":{
      "vehicle":{
         "car":{
            "weight":5,
            "directed":true,
            "color":"orange"
         },
         "truck":{
            "weight":5,
            "directed":true,
            "color":"red"
         }
      },
      "car":{
         "sedan":{
            "weight":2,
            "directed":true,
            "color":"orange"
         }
      }
   }
}

每个图都将始终具有一个带有动态节点和边的对象nodesedges它们各自的属性(colorlabelweight)将被修复。

我试图弄清楚如何最好地为每个用户建模这些数据。我将 Rails 与 MongoDB(Mongoid)一起使用,因为我知道 MongoDB 可以将对象作为文档保存在数据库中。我很确定每个用户都会有一个我可以定义的图形模型,但除此之外,我不确定如何处理节点和边。

我猜该解决方案将涉及has_many,embeds_many或可能serialize,但我不清楚如何将这些与固定数据和动态数据混合使用。

此外,最好按照上面的方式检索数据,这样我可以在从磁盘加载图表时轻松创建图表。

任何帮助,将不胜感激!

4

1 回答 1

0

如果您只需要为每个用户执行图形操作。你可以遵循这个模型。

{
"nodes": [{"type": "vehicle", "color":"black", "label": "vehicle"}, 
          {"type": "car", "color":"orange", "label": "car"},
          {"type":"truck", "color":"red", "label":"truck"},
          {"type": "sedan", "color":"red", "label":"sedan"}
         ],
"edges": {
    "vehicle": [
                  {"type": "car", "weight": 5, "color": "orange"}, 
                  {"type": "truck", "weight": 5, "color": "red"}
               ],
    "car": [
              {"type": "sedan", "weight": 2, "color": "orange"}
           ],
    "sedan": [],
    "truck":: []
}

就像您正在为边缘存储多图一样。此外,它是否是双向的也是自我暗示的。对于要独立处理的单个用户的图形,这是一个非常自然的模型,您可以使用。

告诉我它是否符合您的要求。此外,除非您指定要对集合执行哪种查询,否则无法建议模型。

此外,如果您正在开始您的项目,您可以探索一些图形数据库以及neo4j

于 2012-12-07T20:22:14.877 回答