Edge/Properties 管理的最佳实践

Best practices for Edge/Properties management

我正在为涉及许多不同类型容器和位置的大型库存管理系统实施图形数据库。创建初始布局时,我有 {items} 是“containedBy” {boxes} 是“containedBy” {shelves}。我正在研究的决定涉及预期位置与实际位置。

在我们的库存中,打开箱子时可能没有预期包含在箱子中的物品。这与供应商的上游管理有关。收到清单时,我将在数据库中生成顶点及其边,以表示框中的项目。打开箱子后,我将在接收过程中更新数据库。我想知道的是:使用“expectedContainedBy”和“containedBy”的边来表示可能的和实际的包含更好,还是使用带有 属性 的单边“containedBy”更好? “礼物:true/false”。

我这里的问题不是从偏好的角度出发,而是从检索和分析的效率角度出发。我已经对此进行了一些研究,但我不确定通过 属性 搜索一组边是否比通过边标签搜索更有效,或者数据库是否会因为有这么多边而变得不合理地大.

编辑澄清: 数据库是一个 Azure CosmosDB 图形数据库,使用 Gremlin 作为我们的查询语言。

不用想太多,我会说我更喜欢带有布尔值“present”的“containedBy”属性。这对我来说很自然,当我想到您可能会编写查询此数据的 Gremlin 时,设计应该使查询保持相当可读。

至于效率,看情况。如果你只期望每个盒子有十个“containedBy”边,那么我认为在效率方面没有太多需要考虑的地方。另一方面,数以万计的“containedBy”边缘可能会是不同的故事。此时,您需要考虑图形数据库的功能以及您打算编写的查询类型。例如,对于某些(大多数?)图表,您可能会看到每个“盒子”顶点有数万条边,拥有两个单独的标签会更快。或者,如果您正在使用像 JanusGraph 这样具有以顶点为中心的索引的图形,您可能会发现在“present”上添加索引可以获得您想要的性能,同时保持单个“containedBy”标签的简洁设计。

如果我翻转这个问题,我会看到一个 Schedule 对象。项目链接到明细表,明细表链接到项目曾经、现在和将要存储的所有位置,过去、现在和将来。这些位置对象(盒子、架子等)都与经过这些位置的所有物品相关联。在项目到达之前,知道它们将要到达,可以创建一个关于其他活动计划的计划。您可以询问“系统”11:15有哪些货架可以存放新品。

为什么有些蔬菜比其他蔬菜腐烂得快?您可以查看存储历史,看看腐烂的蔬菜是否共享一个共同的存储位置或仓库区域。