Типичная модель для создания небольших графиков Directed acycli c в БД с JPA - PullRequest
0 голосов
/ 04 апреля 2020

Моя цель - сохранить график неизменных ацикли 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] = _
}

Это выглядит разумно?

...