“看待查询结果以决定使用哪种节点或属性”这个概念的主要思想是数据之间的关系如何影响节点或属性的选择。实际上,图形数据库的主要目的是使遍历关系更容易进行查询。因此,你应该问自己的真正问题是:“(a) ->()<-(b)是否具有重要意义?”换句话说,我需要能够找到共享此属性的其他节点吗?
以下是一些快速的经验法则:
节点
- 拥有自己的子值或关系
- 具有此值的多个节点具有含义,并且您需要能够在它们之间沿着共享的值进行遍历
- 变化不频繁
- 如果同时可以应用多个值
属性
- 具有大范围的可能值
- 随时间变化
- 如果可以应用多个值,则通常作为集合更新值(而不是单独更新)
标签
- 具有小型有限的互斥值范围
- 几乎从不改变
让我们来看看您的一些属性的思考过程...
性别
将是“男性”或“女性”,每个人都将连接到其中之一,因此它们都将成为超级节点(过载)。此外,如果您确实需要找到共享相同性别的两个人,则几乎任何其他方法都比通过超级节点找到它们更有效。但是,这些是相互排斥的、不可变的、基因特征,因此将其作为标签也是完全可以接受的(有时甚至更好)。
地址
这是一个具有子属性的可变值,不会被很多节点共享,并且从一个人到另一个人在同一地址(或者说居住在同一地区)的遍历具有重要意义。因此,这应该几乎肯定是一个节点。
身高和体重
这些随时间不断变化,没有子值,两个共享此值的人几乎没有任何含义。值的范围太广,因此标签也没有意义,因此应该是属性。
血型
虽然选项比性别多,但所有逻辑都适用,除了现在关系确实很重要(因为人们必须分享血型才能捐献)。问题是这个值会非常过载,您需要先按区域进行过滤,然后再验证血型。可以是属性或标签。节点的情况是如果您在血型之间包括“Can_Donate_To”或“Can_Accept”关系。虽然您可能不会遍历这些关系以查找潜在的捐赠者(因为它们太过载,您必须先按区域进行过滤),但您可以使用它们来验证某人是否可以成为捐赠者。
社会安全号码
这是高度敏感的信息,可能会引发诉讼。如果可能的话,请不要将其存入数据库中。如果您确实需要,这个属性是不可变的,但对于每个人来说都是唯一的,因此由于缺乏重复使用,它是一个糟糕的标签,并且作为节点是没有意义的。绝对是一个属性。(但仅出于验证目的,应进行盐值哈希)
母亲的婚前姓氏
可能的值是无限的,两个节点共享此值没有真正的意义。绝对是一个属性。
长子
由于孩子已经有了自己的节点和子属性,只需在两者之间创建关系即可。虽然这些信息的价值是可疑的,但每当您需要引用另一个节点时,始终使用关系。绝对是一个节点。