我们如何在图数据库中建模/表示查找/引用表? 一个特定情况:主转换表(包含许多核心表的查找数据)。 我们应该将它们合并到核心表中吗? RDBMS representation
您可以使用节点对此进行建模。就像是:
CREATE (:Translation{code:'SLD', description:'some lengthy description'})
CREATE (:Translation{code:'NY', description:'New York'})
CREATE (:Translation{code:'USA', description:'United States'})
CREATE (:Address{address:'123 Street St', state:'NY', country:'USA'})
对于使用可能是这样的:
MATCH (p:Person)-[:LIVES_AT]->(a:Address)
WHERE id(p) = 101
OPTIONAL MATCH (state:Translation{code:a.state})
OPTIONAL MATCH (country:Translation{code:a.country})
RETURN a.address as address, state.description as state, country.description as country
也就是说,我认为图形数据库使得这些数据库的需求有些过时。在我看来,使用这些的原因是为了节省空间,因为重复使用相同的值,因此在RDBMS中,仅将较长的描述保留在一个地方是有意义的。
使用图表,这似乎表明您应该将值提取到自己的节点并创建与它的关系,如下所示:
CREATE (ny:State{code:'NY', name:'New York'})
CREATE (usa:Country{code:'USA', name:'United States})
CREATE (a:Address{address:'123 Street St'})
CREATE (a)-[:IN_STATE]->(ny) // or a more generic :IN if desired
CREATE (a)-[:IN_COUNTRY]->(usa) // or a more generic :IN if desired
然后查询将变为:
MATCH (p:Person)-[:LIVES_AT]->(a:Address)
OPTIONAL MATCH (a)-[:IN_STATE]->(state)
OPTIONAL MATCH (a)-[:IN_COUNTRY]->(country)
RETURN a.address as address, state.name as state, country.name as country
你会注意到这看起来非常相似。长国名仍然只存储在一个地方。真正的区别在于上下文,用于处理具有特定标签的节点以及可能更具体的属性键,并且与这些节点的关系是数据模型的一部分,而不是必须以某种方式知道或猜测某些属性字段可以是在另一个节点中查找(例如,在浏览器中尝试CALL db.schema()
)。
如果您在以下位置添加索引,则还可以更轻松地通过代码查找地址:状态(代码)和:国家/地区(代码)。