So, let's say we have 2 types of entities - Company and Department, and they are in one-to-many relationship. Company would have to be indexed, but Department would not because it can be traversed to starting from the parent Company. This fetching via traversal is actually one of best selling points of Neo4j because the speed of that operation generally doesn't depend upon size of whole dataset, unlike SQL databases that have to perform JOIN-ing of different tables which involves tackling with their indexes and performance of that ultimately depends upon table size.
Anyway, all seems good, but it can have some impact on your service layer.
Until now, when you had your Department entities indexed, you had some service layer operation with only one argument needed to reference the entity:
public interface DepartmentManager {
void activateDepartment(UUID departmentUuid);
...
}
And now we must introduce another argument to identify parent Company to be able to traverse the graph to Department in question.
public interface DepartmentManager {
void activateDepartment(UUID companyUuid, UUID departmentUuid);
...
}
Of course, one can argue that we could decide to index Department entities also to simplify accessing them, but then this same reasoning can lead us to index almost all types of entities that we want to operate on at service layer, and we surely want to avoid that for reasons described in the beginning of this post.
Nice short post, thank you Vjeran!
ReplyDelete