Лучше ли использовать таблицы вместо типов полей массивов в PostgreSql, когда массивы не превышают 50 элементов? - PullRequest
18 голосов
/ 11 ноября 2008

Или лучше сказать: когда использовать массив в качестве типа данных поля в таблице?

Какое решение обеспечивает лучшие результаты поиска?

Ответы [ 4 ]

7 голосов
/ 11 ноября 2008

Я избегаю массивов по 2 причинам:

  • сохраняя в ячейке более одного значения атрибута, вы нарушаете первую нормальную форму (теоретическую);
  • вы должны выполнять дополнительную обработку, не связанную с SQL, каждый раз, когда вам нужно работать с отдельными элементами массивов (практично, но является прямым следствием теоретического)
4 голосов
/ 11 ноября 2008

Я также рассмотрел эту проблему и пришел к выводу, что нужно использовать массивы, если вы хотите исключить объединения таблиц. Количество элементов, содержащихся в каждом массиве, не так важно, как размер используемых таблиц. Если в каждой таблице всего несколько тысяч строк, объединение для получения 50 подстрок не должно быть большой проблемой. Если вы попадете в десятки или сотни тысяч или строк, вы, вероятно, начнете жевать через много процессорного времени и дискового ввода-вывода.

0 голосов
/ 13 мая 2019

Я думаю, что для некоторых пользовательских данных нужно использовать массивы. Но для внешних ключей - лучше использовать таблицу ссылок (или что-то еще, кроме столбца на ключ). Таким образом, у вас есть контроль данных на уровне БД и простые запросы на объединение - вам нужно объединение, даже если они есть в массивах (для полного набора данных), - но массивы гораздо сложнее, чем «стандартный» SQL. Постскриптум Извините, плохой английский

0 голосов
/ 11 ноября 2008

Таблицы всегда будут обеспечивать лучшие результаты поиска при условии, что вы запрашиваете что-то внутри фактического массива. С помощью подтаблицы вы можете индексировать содержимое тривиально, тогда как с массивом вам придется буквально создать 50 индексов (по одному для каждого потенциального элемента в массиве).

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