У меня есть приложение 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
становится очень широкой (много столбцов с внешними ключами). Будет ли использование таблицы соединений более эффективным для каждого сопоставления вместо сопоставления всего в одной таблице? Или я просто делаю преждевременную оптимизацию?