Используйте таблицу соединений (также называемую цепочечной таблицей) для определения n-м отношений.
Таблица пользователей (псевдо-SQL):
CREATE TABLE user {
id INTEGER GENERATED PRIMARY KEY,
name VARCHAR
}
Таблица языков (псевдо-SQL):
CREATE TABLE language {
id INTEGER GENERATED PRIMARY KEY,
name VARCHAR
}
Таблица соединений для пользователей и языков (псевдо-SQL):
CREATE TABLE user_language {
user_id INTEGER FOREIGN KEY REFERENCES user(id),
language_id INTEGER FOREIGN KEY REFERENCES language(id)
}
Таким образом, вы можете просто получить все языки по идентификатору пользователя (и всем пользователям, которые привязаны к определенному языку). Некоторые СУБД поддерживают извлечение этих значений в виде типа ARRAY SQL, который, в свою очередь, можно получить с помощью ResultSet#getArray()
в одном запросе. Например, в PostgreSQL вы можете выполнить следующий запрос:
SELECT u.id, u.name, ARRAY(
SELECT l.name
FROM language l
JOIN user_language ul ON u.id = ul.user_id
WHERE l.id = language_id) AS languages
FROM user u
, который вы можете обрабатывать в JDBC следующим образом:
while (resultSet.next()) {
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
Object[] languages = resultSet.getArray("languages").getArray();
// Cast to String[] or convert to List<String> or so yourself.
}