我有一个Spring Boot应用程序,并且我正在通过OneToMany
映射来处理本地化(有很多动态生成的文本,因此这就是为什么我有一种自定义的本地化方法的原因)。本地化的文本将作为一个实体保存到数据库中:
@Entity
@Table(name = "localized_texts")
@Getter
@Setter
public class LocalizedText {
@Id
@Column(name = "text_id", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "lang", nullable = false)
private String lang;
@Column(name = "text", nullable = false)
private String text;
}
所有使用此本地化文本的实体都有一个单向OneToMany
映射:
@OneToMany(cascade = CascadeType.ALL)
@MapKeyColumn(name = "lang")
@JoinColumn(name = "item_description")
private Map<String, LocalizedText> description;
在我的数据库模式中,我使用外键映射它们:
DROP TABLE IF EXISTS localized_texts;
CREATE TABLE localized_texts (
text_id BIGINT AUTO_INCREMENT,
lang VARCHAR(4) NOT NULL,
text VARCHAR(1024) NOT NULL,
item_description VARCHAR(16),
... many foreign keys
PRIMARY KEY (text_id),
CONSTRAINT localized_text_item_description_fk FOREIGN KEY (item_description) REFERENCES item_descriptions (identifier),
... many constraints
);
这很好用,但是我不确定这是否是最有效的方法。假设有20多个实体正在使用这种映射,并且我的localized_texts
表变得非常宽(许多带有外键的列)。对于每个映射,使用联接表会比在一个表中映射所有表更有效吗?还是我只是在做过早的优化?