图数据库中的查找/引用表

时间:2017-12-21 03:35:30

标签: database-design graph neo4j lookup-tables

我们如何在图数据库中建模/表示查找/参考表? 一个特例:主转换表(包含许多核心表的查找数据) 我们应该将它们合并到核心表中吗? RDBMS representation

1 个答案:

答案 0 :(得分:0)

您可以使用节点对此进行建模。类似的东西:

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())。

如果您在以下位置添加索引,也可以更轻松地通过代码查找地址:状态(代码)和:国家/地区(代码)。