我正在设计一个投票应用程序,并设计了一个包含2个表的数据库 - 州和区。 这两个表是 -
State_ID NUMBER(3)
State_name VARCHAR2(30)
PRIMARY KEY(State_ID)
District_ID NUMBER(3)
State_ID NUMBER(3)
District_name VARCHAR2(30)
PIN_Code NUMBER(6)
PRIMARY KEY(District_ID)
UNIQUE(State_ID,District_name)
FOREIGN KEY(State_ID)
由于两个州可以有一个同名的地区,我正在考虑将国家身份证和地区名称组合为UNIQUE的组合。
现在我必须为这两个表设计JPA实体,但是我无法设计,因为在数据库设计中,区域表中的状态ID是外键,但是当涉及到设计具有状态的实体时区内的对象听起来毫无意义,因为如果我在脑海中保持HAS-A关系,那么区域中没有状态。 州HAS-A区列表。这与上述数据库设计不符。
有人可以帮我设计JPA实体。请建议数据库设计是否也需要修改。 感谢。
答案 0 :(得分:1)
CREATE TABLE States (
code CHAR(2) NOT NULL CHARACTER SET ascii,
name VARCHAR(30) NOT NULL,
PRIMARY KEY(code)
);
CREATE TABLE Districts
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
state_code CHAR(2) NOT NULL CHARACTER SET ascii,
...
PRIMARY KEY(id),
UNIQUE (state_code, name)
);
注意:
*如果你在谈论美国,也可以使用标准的州代码(AK,AL,......)
* States
的唯一目的可能是说明这个名字
*如果您的表默认为utf8,我明确指出了ascii
* MySQL使用VARCHAR,而不是VARHAR2
*你可以摆脱Districts.id
而只是PRIMARY KEY(state_code, name)
,但我猜你有很多其他表需要加入这个表,而且是2字节id
会比庞大的替代品更好。
答案 1 :(得分:1)
基于Rick's proposal的示例JPA方法:
@Entity
@Table(name = "States")
public class State {
@Id
@Column(nullable = false, columnDefinition = "CHAR(2) CHARACTER SET ascii")
private String code;
@Column(nullable = false, length = 30)
private String name;
@OneToMany(mappedBy = "state")
private Collection<District> districts;
public State() { }
// getters, setters, etc.
}
@Entity
@Table(name = "Districts", uniqueConstraints = {
@UniqueConstraint(columnNames = { "state_code", "name" })
})
public class District {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, columnDefinition = "SMALLINT UNSIGNED")
private short id;
@Column(name = "state_code", nullable = false,
columnDefinition = "CHAR(2) CHARACTER SET ascii")
private String code;
@Column(length = 30)
private String name;
@ManyToOne
@JoinColumn(name = "state_id")
private State state;
public District() { }
// getters, setters, etc.
}
注意:由于使用了columnDefinition
属性,上述实体无法跨数据库移植。