假设我是一名机械师,曾研究过许多不同的汽车,并希望保存我研究过的汽车的数据库。这些汽车有不同的制造商、型号,一些客户用不同的零件对这些汽车进行了改装,因此不能保证同一型号的汽车能给你同样的汽车。此外,我希望能很容易地看到所有这些不同的汽车及其异同。基本上,数据库需要同时表示我遇到的所有汽车之间的逻辑相似性/差异,同时仍然让我能够推/拉我遇到的汽车的每个实例。
-
这是为关系数据库或图形数据库设置的吗?
-
如果是一个图形数据库,你会如何设计它?每个关系标签都只是一个"has_a"或"is_a_type_of"。你会有所有汽车之间的逻辑结构吗?对于每个汽车,让它们指向叶节点?或者,你会让每一种关系代表每一辆特定的汽车,并让这些关系跨越汽车的逻辑树结构吗?
好吧,实现这一点的"graphy"方法是为每种域对象创建一个节点类型。您有一个由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等信息标识,而不是由品牌/型号/年份标识。(稍后拆分品牌/型号/年份,可以非常方便地查询所有沃尔沃汽车等)。
你的最后一个问题(也是最难的一个):
这是为关系数据库或图形数据库设置的吗?
这是一个有主见的问题(它吸引了有主见答案),让我这样告诉你:太阳下的任何数据都可以通过关系和图表来完成。所以我可以同时回答是关系图和是图。您的数据和域没有选择应该使用RDBMS还是Graph。您的查询和访问模式选择RDBMS与图形。如果你知道你需要如何使用你的数据,你将运行哪些查询,以及你试图做什么,那么有了这些信息,你就可以自己进行分析,并确定哪一个更好。两者都有长处和短处,也有许多折衷之处。如果不知道如何访问数据,就不可能以真正公平的方式回答这个问题。