Моя цель - сохранить график неизменных ацикли c без циклов. Я планирую использовать springboot-starter-data-jpa (JPA) для этого. Существуют некоторые ограничения:
- до 600 узлов на графике
- до 20 градусов на графике
- до 2000 ребер на графике
- максимальная глубина 100
Это нормально, если поиск графика ухудшается в случае достижения ограничений.
Запросы:
- хранить весь график
- получение всего графика
- получение узла по идентификатору с подключенными узлами
Модель:
- один объект GraphEntity имеет множество EdgeEntities
- EdgeEntity имеет fromNode
- EdgeEntity имеет toNode
- Узел hasMany inboundEdges
- Узел hasMany outboundNodes
Объекты:
@Entity
@Table(name = "Graph")
class GraphEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long = _
@OneToMany(
mappedBy = "graph",
fetch = FetchType.EAGER,
cascade = Array(CascadeType.ALL),
orphanRemoval = true)
var edges: util.List[EdgeEntity] = _
}
@Entity
@Table(name = "Edge")
class EdgeEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long = _
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "graphId", nullable = false, insertable = true, updatable = false)
var graph: GraphEntity = _
@ManyToOne(cascade = Array(CascadeType.ALL))
var fromNode: NodeEntity = _
@ManyToOne(cascade = Array(CascadeType.ALL))
var toNode: NodeEntity = _
}
@Entity
@Table(name = "Node")
class NodeEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
var id: Long = _
@Column(nullable = false)
var name: String = _
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "graphId", nullable = false, insertable = true, updatable = false)
var graph: GraphEntity = _
@OneToMany(fetch = FetchType.LAZY, mappedBy = "toNode")
var inboundEdges: util.List[EdgeEntity] = _
@OneToMany(fetch = FetchType.LAZY, mappedBy = "fromNode")
var outboundEdges: util.List[EdgeEntity] = _
}
Это выглядит разумно?