【问题标题】:Graph Database Data Model of One Type of Object一种对象的图数据库数据模型
【发布时间】:2015-04-17 04:34:54
【问题描述】:

假设我是一名修理过许多不同汽车的机械师,并且想保留一个我曾修理过的汽车的数据库。这些汽车有不同的制造商、型号,并且一些客户对这些汽车进行了改装,但零件不同,因此不能保证相同的型号可以为您提供相同的汽车。此外,我想轻松查看所有这些不同的汽车及其相似/不同之处。基本上,数据库需要既代表我遇到的所有汽车之间的逻辑相似性/差异,同时仍然让我能够推/拉我遇到的汽车的每个实例。

  1. 这更多是为关系数据库还是图形数据库设置?

  2. 如果是图形数据库,您将如何设计它?每个关系标签都只是“has_a”或“is_a_type_of”。您是否有所有汽车之间的逻辑结构,并且对于每辆单独的汽车,它们都指向叶节点?还是让每个关系代表每辆特定的汽车,并让这些关系跨越汽车的逻辑树结构?

【问题讨论】:

    标签: neo4j data-modeling graph-databases


    【解决方案1】:

    好吧,解决这个问题的“图形”方法是为每种域对象创建一个节点类型。您有一个由VIN 标识的Car,它可以链接到MakeModelYear。您还拥有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 与图。如果您知道您需要如何使用您的数据、您将运行哪些查询以及您正在尝试做什么,那么您可以使用这些信息进行自己的分析并确定哪个更好。两者都有优点和缺点以及许多权衡点。在不知道如何访问数据的情况下,不可能以真正公平的方式回答这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多