более одного значения для столбца в базе данных - PullRequest
3 голосов
/ 18 января 2010

возможно ли хранить более одного значения в столбце базы данных. если да, какой тип я должен использовать? и через мой код Java, как я могу вставить значения.

например, я хочу иметь столбец "language", который может хранить такие значения, как java, c ++, c # и т. Д. Для одной строки.

РЕДАКТИРОВАТЬ : я хочу, чтобы у меня была таблица с именем студента со всей информацией о студенте с колонкой для хранения названий языков, которые он знает.

Ответы [ 8 ]

9 голосов
/ 18 января 2010

Вам следует создать таблицу «language» со всеми различными языками, которые вы хотите использовать, а затем использовать внешний ключ для ссылки на эту таблицу из столбца LanguageID в другой таблице.

Редактировать: Если вы хотите использовать более 1 языка для данной записи, вам также необходимо создать таблицу связывания, которая связывает запись с заданным LanguageID.Затем вы можете добавить любое количество языков для данной записи, создав новые записи в таблице ссылок.

5 голосов
/ 18 января 2010

Хранение нескольких значений в одном столбце, как правило, не очень хорошая идея, поскольку это нарушает принципы нормализации базы данных .

Из вашего описания это звучит так, как будто у вас многомного отношений.Реализация его путем сохранения нескольких значений в столбце заставит вас работать усерднее, чем необходимо, когда вы хотите обновить столбец или выполнить запрос по языку.

Технически возможно придумать обходной путь (как предложил Telcontar,например), но я бы порекомендовал прочитать немного о различных нормальных формах и пересмотреть структуру базы данных.

2 голосов
/ 18 января 2010

Используйте таблицу соединений (также называемую цепочечной таблицей) для определения 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.
}
2 голосов
/ 18 января 2010

Если вы знаете о дизайне базы данных и хотите избавиться от этой дополнительной языковой таблицы, которая является обычным «хорошим» способом сделать это, вы можете использовать, например, строку.

В строке сохраните код языка ISO, который напоминает «en-en» (первая страна, вариант второго языка ») вместе с токеном-разделителем, очевидно, пробел может быть хорошим, так что« en-en de "для английского и немецкого языков.

Затем вы можете использовать оператор «like» в этом строковом столбце для сложного многоязыкового сопоставления.

Если вы профессионал и знаете, что делаете, вы можете назвать это оптимизацией. Если вы новичок, то вы, очевидно, не знали, что сделали, и что означает «отношение» в системах реляционных баз данных.

1 голос
/ 18 января 2010

Вам нужно создать таблицу языков, как упомянуто Заком, где представлен каждый язык, а затем иметь таблицу для связи с ними, например _-Langage (где _ заменяется исходным именем таблицы)

Эта таблица связывания будет иметь инкрементный индекс в качестве своего Первичного ключа и будет иметь Внешний ключ таблицы Language и Исходной таблицы. Тогда в таблице связей может быть несколько строк для каждого языка, необходимого в исходной таблице

1 голос
/ 18 января 2010

Вы имеете в виду перечисление, в котором могут использоваться только определенные значения, или вы хотите хранить более одного значения в столбце для данной строки?Несколько значений

Не делайте этого, используйте вместо этого отношение многие ко многим:

table whatever (
  id int
);
table language (
  id int,
  name varchar(256)
)
table whatever_language)(
  whatever_id int,
  language_id int
)
-- don't forget foreign key constraints
0 голосов
/ 18 января 2010

То, о чем вы говорите, - это отношение «многие ко многим» между вашим столом (вы не назвали имя) и языками.
Позвольте мне предположить, что ваша таблица посвящена людям и вы хотите отслеживать, какие люди владеют какими языками.
Любой данный человек будет владеть одним (возможно, нулевым) или несколькими языками. Чтобы смоделировать это, вам нужны три таблицы: Person, Language и третья, которая связывает две, возможно LanguageProficidity, которая имеет ссылку на одного человека и один язык. В этой таблице вы можете иметь несколько строк для одного и того же человека или одного и того же языка, но у вас должна быть только одна запись на уникальную комбинацию человека и языка (т.е. эти два столбца образуют первичный ключ этой таблицы).

Преимущество использования третьей таблицы здесь (по сравнению с некоторыми другими предложениями, такими как объединение их в текстовое поле) заключается в том, что ее легко расширить, чтобы включить дополнительные атрибуты, например, сколько лет человек использовал язык, или оценка уровня владения языком, или какой-то тестовый балл. Это то, что вы хотели бы знать для каждой комбинации человека и языка, поэтому оно относится к таблице LanguageProficidity.

0 голосов
/ 18 января 2010

Я думаю, что ответ Zack верен, но если вам ДЕЙСТВИТЕЛЬНО нужно хранить несколько значений в строке базы данных, вы можете использовать тип VARCHAR и использовать разделитель, такой как «;» для разделения значений, но вы должны быть осторожны при добавлении / редактировании этих значений, чтобы правильно их проанализировать.

Или, если вы используете базу данных Oracle, вы можете определить тип столбца как ARRAY, но это устаревшее решение, которое генерирует слишком много зависимостей, я не рекомендую его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...