【问题标题】:Using Spring Data JPA with an adjacency matrix stored in a MySQL database将 Spring Data JPA 与存储在 MySQL 数据库中的邻接矩阵一起使用
【发布时间】:2021-12-08 10:15:24
【问题描述】:

我是使用 Spring Data Jpa 的新手,但我知道通常会在 Java 中创建一个“模型”/“实体”类,它代表数据库表中的一行数据。当我有一个具有 3 列/类属性的小表时,这对我来说很有意义,但是对于具有 100 列的表的情况呢?很难创建具有 100 个属性的“模型”类?我问这个的原因是因为我在 MySQL 数据库表中存储了一个大型的火车站邻接矩阵。我想在我的 Java Spring 应用程序中与这些数据进行交互,但我不知道如何做到这一点。

我对我可能错误地存储数据或在这种情况下根本不应该使用 Spring Data JPA 持开放态度。任何建议将不胜感激!

谢谢。

编辑:

我会尝试更清楚地解释我想要做的事情。我想基本上将这个“站”(邻接矩阵)数据库表的副本导入到我的 Java Spring 应用程序中。我不知道如何最好地执行此“导入”,或者将表存储在什么 Java 数据结构中。我希望能够在 Java 中对数据运行一次 BFS 等算法。

表中的数据是显示火车网络图的邻接矩阵。 “1”表示车站由轨道连接,“0”表示没有连接。

【问题讨论】:

  • 每个Station 有多少个相邻的Station?我猜是 1 或 2
  • @JettoMartínez 'Station' 节点的最大度数是 4

标签: java mysql spring spring-data-jpa adjacency-matrix


【解决方案1】:

如果您的模型真正用一百个属性表示,那么是的,您可以创建一个具有一百个属性的实体。但我认为您的模型需要重新设计,因为按照我的看法,插入新记录需要更改架构。

由于我不知道这些列代表什么,我将假设它们可能是下一站和上一站?这将是一个简单的模型来表示这一点。

@Entity
@Table(name = "station")
@Getter
@Setter
public class Station {

   @Id
   private Long id;

   @Column(name = "name")
   private String name;

   @OneToOne
   @JoinColumn(name = "previous_station_id")
   private Station previous;

   @OneToOne
   @JoinColumn(name = "next_station_id")
   private Station next;
}

您的 DDL 如下所示:

create table station
(
    id                  bigint auto_increment,
    name                varchar(255) null,
    previous_station_id bigint       null,
    next_station_id     bigint       null,
    constraint station_id_uindex
        unique (id),
    constraint station_station_id_fk
        foreign key (previous_station_id) references station (id),
    constraint station_station_id_fk_2
        foreign key (next_station_id) references station (id)
);

create index station_next_station_id_index
    on station (next_station_id);

create index station_previous_station_id_index
    on station (previous_station_id);

alter table station
    add primary key (id);

因为这个表实际上有返回给它自己的键,所以你首先要插入一个没有上一个或下一个集合的站,然后你会更新记录来设置这些值。如果我对这些值的含义不满意,请更新您的问题以更好地描述您尝试建模的内容以获得更准确的答案。

【讨论】:

  • 感谢您的回答,但我认为这不是我要找的。我已经更新了我的问题,希望它现在更有意义。
【解决方案2】:

在这种情况下,将其表示为多对多关系可能会很好。我对 JPA 不是很熟悉,但我认为它看起来像这样:

@Getter
@Setter
@Entity
public class Station {

    @Id    
    private Long id;

    private String name;

    @ManyToMany       
    private Set<Station> adjacentStations;
}

站点是相互连接的,这样当站点 B 与站点 A 相邻时(即 B 在 A 的相邻站点集合中),则站点 A 也与站点 B 相邻(即 A 也在 B 的相邻站点集合中)。

然后,在数据库中,站点之间的关系将通过一个映射表来表示,该映射表具有两列(station_id_1、station_id_2)和一个用于每个连接的行。

【讨论】:

  • 这可能是一个愚蠢的问题,但我可以不只是将我的原始表分成 2 个表:1) 'id' 和 '站名' 的两列表 2) 所有的邻接矩阵零和一,然后将它们分别导入 HashMap 和 2D ArrayList?这不比创建你的 Station 类更简单吗?
  • 正如@lane.maxwell 正确指出的那样,如果您要在数据库中表示邻接矩阵,如屏幕截图所示,即每个站一列一行,您必须更改每次添加站时的架构(添加新列)。我认为,您应该考虑这样一种想法,即屏幕截图中显示邻接矩阵的方式只是一种可视化,而不是数据在代码/数据库中的实际结构方式。
【解决方案3】:

你可以像这样使用两个类:

@Entity
public class TestClass {    
   @Id
   private long id;

   @OneToMany(mappedBy="testClass")
   private List<MatrixRow> matrix; 
}

还有一个 MatrixLine 类:

@Entity
public class MatrixRow {
  @Id
  private long id;

  @ManyToOne
  private TestClass testClass;

  @CollectionOfElements
  private List<Value> row;
}

【讨论】:

    【解决方案4】:

    我认为,当您进行 BFS 时,您需要以前的站名,因此您必须创建一个具有 100 个名称的模型类并使用 @Getter 和 @Setter 注释,或者创建一个具有 100 个元素的列表并存储索引在其他文件中表示为枚举,在这种情况下,您必须将数据库模式更改为站和数组作为 blob/text。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2015-07-13
      • 2017-04-01
      • 2015-03-24
      • 2015-03-14
      相关资源
      最近更新 更多