Как сохранить список в столбце БД - PullRequest
49 голосов
/ 14 января 2009

Я хотел бы сохранить объект FOO в базе данных. Допустим, FOO содержит три целых числа и список " Fruits ".

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

Можно ли сохранить список фруктов в столбце?

Ответы [ 6 ]

85 голосов
/ 14 января 2009

В нормализованной реляционной базе данных такая ситуация недопустима. У вас должна быть соединительная таблица, в которой хранится одна строка для каждого отдельного идентификатора объекта FOO и идентификатора Fruit. Наличие такого ряда означает, что фрукты находятся в этом списке для FOO.

CREATE TABLE FOO ( 
  id int primary key not null,
  int1 int, 
  int2 int, 
  int3 int
)

CREATE TABLE Fruits (
  id int primary key not null,
  name varchar(30)
)

CREATE TABLE FOOFruits (
  FruitID int references Fruits (ID),
  FooID int references FOO(id),
  constraint pk_FooFruits primary key (FruitID, FooID)
)

Чтобы добавить фрукт Apple в список определенного объекта FOO с ID = 5, вам необходимо:

INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'
4 голосов
/ 14 января 2009

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

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

Однако для «правильного» решения сделайте то, что Mehrdad описал выше.

3 голосов
/ 14 января 2009

Это технически возможно, но очень плохой дизайн, имхо.

Вы можете сделать это, собрав строку и сохранив ее в поле nvarchar (max) (при использовании сервера sql или его эквивалента).

0 голосов
/ 14 января 2009
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID 
FROM   Fruits 
WHERE  name IN ('Apple', 'Orange');
0 голосов
/ 14 января 2009

Можно, но, скорее всего, он будет рассматриваться как текст, что делает поиск в этом столбце трудным и медленным. Вам лучше использовать связанную таблицу.

0 голосов
/ 14 января 2009

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

Создайте таблицу с двумя столбцами, один из которых содержит указатели на первичный ключ таблицы объектов, а другой - указатели на первичный ключ таблицы фруктов. Затем, если у объекта есть три фрукта, в таблице object_fruit есть три строки, которые все указывают на один и тот же объект, но на три разных фрукта.

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