“查看查询以决定”背后的主要思想是,数据之间的相互关系会影响节点或属性是否更好。确实,图数据库的主要目的是使步行关系更易于查询。所以你应该问自己的真正问题是“(a)-->()
这里有一些快速的经验指南
节点
- 有自己的子值或关系
- 多个节点共享这个值是有意义的,你需要能够在它们之间沿着这个共享值走
- 很少更改
- 如果可以同时应用多个值
属性
- 可能的值范围很广
- 随时间变化
- 如果可以应用多个值,则通常将值作为一组更新(而不是单独更新)
标签
让我们来看看你的一些属性的思考过程......
性
将是“男性”或“女性”,每个人都将连接到两者之一,因此他们最终都会成为超级节点(过载)。另外,如果你最终需要找到两个同性的人,几乎任何其他方法都比通过超级节点找到他们更有效。然而,这些是相互排斥、不可变的遗传特征,因此将其作为标签也是完全可以接受的(有时是首选)。
地址
这是一个具有子属性的变量值,不会被很多节点共享,并且从一个人到另一个人在同一地址(或者,通过扩展,居住在一个区域)具有有价值的意义。所以这几乎肯定是一个节点。
身高和体重
这些随着时间不断变化,没有子价值,两个人分享这个价值几乎没有意义。值的范围太宽了,所以标签也没有,所以这应该是一个属性。
血型
虽然有比 Sex 更多的选择,但所有相同的逻辑都适用,只是关系现在很重要(因为人们必须共享一种血型才能捐献)。问题是这个值太重了,你需要先过滤区域,而不仅仅是验证血型。可以是属性或标签。节点的情况是,如果您在血型之间包含“Can_Donate_To”或“Can_Accept”关系。虽然您可能不会通过这些关系来寻找潜在的捐赠者(因为它们过于繁重,并且您必须先按区域过滤),但您可以使用它们来验证某人是否可以成为捐赠者。
社会安全号码
高度敏感,等待发生的诉讼。尽可能远离数据库。如果你必须这样做;这个属性是不可变的,但是对每个人来说都是唯一的,所以由于缺乏重用,是一个不好的标签,作为一个节点将毫无意义。绝对是财产。 (但如果仅用于验证目的,则应加盐+散列)
母亲的娘家姓
可能的值是无穷无尽的,共享这个值的两个节点没有实际意义。绝对是财产。
第一个孩子
由于孩子已经是自己的节点,具有自己的子属性,只需在两者之间建立关系。尽管此信息的价值值得怀疑,但任何时候您需要引用另一个节点时,请始终为其使用关系。绝对是一个节点。