Когда хранить данные в обозначенной таблице или сериализованной?Как сделать звонок? - PullRequest
0 голосов
/ 20 января 2012

Я использую установку postgresql для размещения своих данных.

В модели My Post есть атрибут «выбор», который в настоящее время хранит данные в столбце TEXT в виде: «x1, x2, x3»., x4, x5 ... "

Когда мне нужно получить доступ к этим данным, я разделяю их на запятую и делаю свое дело с ними.

Я создаю прототип приложения, поэтому я быстропросто сделал самое простое, когда писал, но теперь я вижу альтернативный вариант - создать таблицу для «выборов» и связать ее с постом, а затем иметь отдельные строки для каждого бита.

У меня вопрос, как или когда я делаю выбор: хранить данные или нет?

Спасибо

Ответы [ 2 ]

1 голос
/ 20 января 2012

PostgreSQL имеет типы массивов - так что вы можете использовать тип "text []"

postgres=# create table xxx(a text[]);
CREATE TABLE
postgres=# insert into xxx values(array['x1','x2']);
INSERT 0 1
postgres=# insert into xxx values(array['x1','x2','x3']);
INSERT 0 1
postgres=# select * from xxx where 'x1' = ANY(a);
     a      
------------
 {x1,x2}
 {x1,x2,x3}
(2 rows)

postgres=# select * from xxx where 'x3' = ANY(a);
     a      
------------
 {x1,x2,x3}
(1 row)

Вы также можете использовать индекс для больших данных

0 голосов
/ 20 января 2012

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

SQL вообще оптимизирован для арифметики на основе множестви функции, а не для разбора строк.

Единственный сценарий, в котором я могу придумать, где версия строки может быть проще / быстрее, - это если вы хотите найти определенный набор значений и ТОЛЬКО эти значения, то есть Col = 'A1, B2, C3, d4'.

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

...