【问题标题】:Graph Database Data Model of One Type of Object一种对象的图数据库数据模型
【发布时间】:2015-04-17 04:34:54
【问题描述】:
假设我是一名修理过许多不同汽车的机械师,并且想保留一个我曾修理过的汽车的数据库。这些汽车有不同的制造商、型号,并且一些客户对这些汽车进行了改装,但零件不同,因此不能保证相同的型号可以为您提供相同的汽车。此外,我想轻松查看所有这些不同的汽车及其相似/不同之处。基本上,数据库需要既代表我遇到的所有汽车之间的逻辑相似性/差异,同时仍然让我能够推/拉我遇到的汽车的每个实例。
这更多是为关系数据库还是图形数据库设置?
如果是图形数据库,您将如何设计它?每个关系标签都只是“has_a”或“is_a_type_of”。您是否有所有汽车之间的逻辑结构,并且对于每辆单独的汽车,它们都指向叶节点?还是让每个关系代表每辆特定的汽车,并让这些关系跨越汽车的逻辑树结构?
【问题讨论】:
标签:
neo4j
data-modeling
graph-databases
【解决方案1】:
好吧,解决这个问题的“图形”方法是为每种域对象创建一个节点类型。您有一个由VIN 标识的Car,它可以链接到Make、Model 和Year。您还拥有Mechanic 节点和[:work_on] 各种Car 节点。不要将品牌/型号/年份与汽车一起存储,而是通过关系链接,例如:
CREATE (c:Car { VIN: "ABC"})-[:make]->(m:Make {label:"Toyota"});
...等等。
每个关系标签都只是一个“has_a”或
'is_a_type_of'。
可能不会,我会创建不同的关系类型,这些关系类型对节点类型的配对是唯一的。所以 Mechanic -> Car 将是 :works_on,Car -> Model 将是 [:model] 等等。我不建议在任何地方都使用像has_a 这样的相同关系类型,因为从建模的角度来看,很难理清这些关系的有效域和范围(例如,您最终会遇到has_a 可以去的情况从几乎任何东西到几乎任何东西,挑选出你想要的has_a 关系会很困难)。
或者你会让每个关系代表每辆特定的汽车和
这些关系是否跨越了汽车的逻辑树结构?
每辆车都有自己的节点,由 VIN 之类的东西标识,而不是由品牌/型号/年份。 (拆分品牌/型号/年份后,您可以非常轻松地查询所有沃尔沃汽车等)。
你的最后一个问题(也是最难的一个):
这更多的是为关系数据库还是图形数据库设置?
这是一个固执己见的问题(它吸引固执己见的答案),让我这样告诉您:阳光下的任何数据都可以通过关系和图表来完成。所以我可以回答 both 是的关系,是的图表。您的数据和您的域不会选择您应该使用 RDBMS 还是 Graph。您的查询和访问模式选择 RDBMS 与图。如果您知道您需要如何使用您的数据、您将运行哪些查询以及您正在尝试做什么,那么您可以使用这些信息进行自己的分析并确定哪个更好。两者都有优点和缺点以及许多权衡点。在不知道如何访问数据的情况下,不可能以真正公平的方式回答这个问题。