这与其说是一个技术问题,不如说是一个逻辑问题。我请求对我的要求进行数据组织指导。请记住,我愿意为此目的使用图数据库(虽然我在这方面是个新手)。所以非常感谢在图数据库背景下的指导。
让我提供一个场景的概述。在应用程序中有两个实体。User
和 House
. 用户可以 owns
宅 rents
一间房子。如果一个用户 rents
(a) 在租房时,应注明用户租用该房屋的时间段。一个用户可以在不同的时间段内租用同一房屋。
演示数据集。
A (User) -owns-> H1, H2, H3 (House) - one-liner for brevity
X -rents-> H2 (start=DATE1, end=DATE2)
Y -rents-> H2 (start=DATE3, end=DATE4)
X -rents-> H2 (start=DATE5, end=DATE6) - user rents same house again
我假设 User
和 House
将是节点和 owns
和 rents
将是边缘。租期将是属性的 rents
边缘。如果有什么更好的方法,请大家指点。
问题。
任何指导我应该如何保持数据与关系将是非常感激的。祝您愉快。
可能有比这个更好的答案,还是把我的使用图的经验贴在给定的需求上,如果这对你有帮助的话。
我认为对于你的需求,回答你的问题,最适合用图数据库。
这更多的是设计你的图模型以适应目的,我认为你可以有多个不同时期的租金边,从节点用户到节点房子.哪种方式你可以维护历史,你可以以后删除旧的过期时期边,如果你想。
[只是为了避免重复]假设这里你需要确保只有当周期槽是空闲的时候,才会在节点(user & house)之间创建边缘。你可以在创建节点之间的边缘时,在查询中添加逻辑。
通过给定的演示数据集,下面是我根据你所描述的场景创建的示例图。
http:/console.neo4j.org?id=bxu3sp
点击上面的控制台链接,可以在底部的查询窗口中运行下面的cypher查询。
MATCH (user:User)-[rent:RENT]->(house:House)
WITH house, rent
ORDER BY rent.startDate
WITH collect(rent) as rents, house
UNWIND range(0, size(rents)-1) as index
WITH rents, index, house
WHERE duration.inDays(date(rents[index].endDate), date(rents[index+1].startDate)).days > 30
RETURN house
这将得到在给定时期范围内没有分配的房屋列表。
我想说的是,这是一个学习曲线,只要探索和玩转它,就能让自己进入图DB世界。
更新一下。如果同一个用户在不同的时间段租了同一栋房子,那么这个图就会像下面所说的那样,你应该通过不允许任何用户节点和任何房子节点之间的相同重叠窗口期的边来避免创建重复。在这个图中,我已经为不同的和不重叠的开始日期创建了边,所以哪个是有效的,而不是重复的。