我如何在MySQL中设计表来保存包含许多其他类的类的状态?
这是我项目要求的一个具体例子。
public class Profile{
private long userId;
private String firstName;
private String lastName;
private Equipment equipment;
private TennisRacket tennisRacket;
}
该课程来自Android项目。我正在使用JAX-RS作为后端。我需要在后端保存这个类。
String和long很容易,但我不知道如何处理这个类中的两个对象。
答案 0 :(得分:1)
这样做的常见模式是有一个名为profile
的表格,以及其他对象equipment
和tennis_racket
的表格。
在profile
表中,您有一个名为equipment_id
的字段,它是引用equipment
表中一行的外键,同样是另一个名为tennis_racket_id
的字段是引用tennis_racket
表中的行的外键。
profile
|user_id|first_name|last_name|equipment_id|tennis_racket_id|
|1 |Bob |Brown |7 |5 |
equipment
|equipment_id|description|
|7 |ball |
tennis_racket
|tennis_racket_id|size |
|5 |large|
您可以自己管理所有这些并使用JDBC
连接查询数据库,然后手动填充对象。为id = 1的用户检索网球拍的查询可能如下所示:
SELECT t.*
FROM profile p
JOIN tennis_racket t ON p.tennis_racket_id = t.id
WHERE p.user_id = 1
了解我们如何将profile
表加入tennis_racket
上的tennis_racket_id
表。
您可以使用ORM
(对象关系映射)工具,例如JPA或Hibernate来管理繁重的工作。在基本级别,它为您提供了一种类似SQL的查询语言,并处理将查询结果复制到Java对象中。这在某些方面是一个更复杂的解决方案,你必须学习一些新工具,但从长远来看它可以更容易。
答案 1 :(得分:1)
您可以创建三个表(个人资料,设备,tennis_racket)并与他们建立关系。
create table profile(
userId INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
equipment_id INT default NULL,
tennis_racket_id INT default NULL,
PRIMARY KEY (userId)
);
create table equipment(
id INT NOT NULL auto_increment,
--other columns your class has
PRIMARY KEY (id)
);
create table tennis_racket(
id INT NOT NULL auto_increment,
--other columns your class has
PRIMARY KEY (id)
);
if you use JPA you can use following entity classes
@Entity
@Table(name = "profile")
public class Profile{
private long userId;
private String firstName;
private String lastName;
@ManyToOne
@JoinColumn(name="equipment_id", nullable=false)
private Equipment equipment;
@ManyToOne
@JoinColumn(name="tennis_racket_id", nullable=false)
private TennisRacket tennisRacket;
}
@Entity
@Table(name = "equipment")
public class Equipment {
private long Id;
//add other attributes
}
@Entity
@Table(name = "tennis_racket")
public class TennisRacket{
private long Id;
//add other attributes
}
答案 2 :(得分:0)
看起来每个人只有一个设备和一个 tennisRacket。所以我觉得亚特的回答很好。
如果每个人都可以拥有许多设备或者网球服,你应该再增加一个主键 (user_id,equipment_id,tennis_racket_id)的表格。