2013-07-27 5 views
3

У меня есть некоторые данные, которые мне нужно добавить в базу данных PostgreSQL. Эти данные относятся к школам. Таким образом, существует много атрибутов, относящихся к школе, в основном небольших целых чисел, поплавков или небольших текстов. И все данные меняются ежегодно. Поэтому я создаю объект под названием YearlyData и помещаю туда атрибуты. Но дело в том, что количество атрибутов составляет около 50-60. Теперь они не могут быть нормализованы, потому что они являются простыми атрибутами самой школы. Поэтому я этически не могу разделить их на таблицы. Но я не уверен, что это навредит моей работе.Недостатки таблицы со слишком большим количеством столбцов

Я могу попытаться классифицировать эти данные и поместить их в отдельные таблицы и указать на них из таблицы YearlyData. Но тогда попытка поиска школ с параметрами 20-30 + вызовет безумное количество объединений, я предполагаю. Я также не уверен, что это навредит моей работе.

Любые консультации экспертов?

+0

Я не думаю, что колонки 50-60 вызовут проблемы, если они не являются действительно широкими столбцами, такими как много текстовых и блочных данных. О каких данных мы говорим? Если это в основном целые числа, даты и т. Д., То это, вероятно, хорошо. – David

+0

да. в основном целые числа, поплавки или небольшие тексты. –

+0

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

ответ

1

Есть несколько вещей, чтобы рассмотреть здесь:

  • Имеет ли список атрибутов изменений значительно в течение долгого времени
  • Требует ли список атрибутов пользовательских определяемого пользователя атрибуты
  • ли есть разные атрибуты для разных школ (т.е. многие атрибуты применимы только к одной или нескольким школам)?

Если все это верно, вы можете подумать о подходе к хранилищу свойств like EAV, hstore, json fields, xml fields, etc.

Если нет - если у вас есть довольно статический список свойств, в которых большинство из них имеет смысл для большинства строк, то нет проблем с тем, чтобы иметь их как 60 отдельных столбцов. Будет проще добавлять индексы для обычного поиска наборов атрибутов, включая частичные и составные индексы и т. Д., А поисковые запросы - в частности, для многих разных атрибутов - будут быстрее .

Смотрите также: Database design - should I use 30 columns or 1 column with all data in form of JSON/XML?

Там также доступен компромиссный вариант: Основная таблица для наиболее важных деталей вы смотрите на много, плюс боковой таблицу для логической группировки атрибутов. Скажи:

yearly_summary (
    yearly_summary_id serial primary key, 
    school_id integer, 
    total_students integer, 
    ... 
) 

плюс

yearly_student_stats(
    yearly_summary_id integer primary key references yearly_summary(yearly_summy_id) on delete cascade, 
    ... 
) 

и т.д. integer primary key, что также в foreign key означает, что вы насильственные 1: 1 (по желанию) отношений к другой таблице. Этот подход может быть полезен, если у вас есть несколько логических группировок атрибутов, которые можно кластеризовать в боковые таблицы.

Я также был бы удивлен, если бы немного больше думал не раскрывать вещи, которые do имеют смысл нормализовать. У вас есть year7_blah, year8_blah, year9_blah и т. Д. Столбцы? Если да: отличный кандидат на нормализацию.

+0

В настоящее время я тестирую множество столбцов. Была ли какая-то логическая группировка. Если это сработает, я думаю, что я пойду с этим. И нет, атрибуты похожи на 'has_computers',' number_of_computer', 'number_of_boys' и так далее. Я уверен, что могу разделить их на более логичные группы, но это не нормализуется, не так ли? –

+0

@Bibhas На самом деле это не нормализуется, но работа с БД не всегда связана с чистотой, иногда это связано с компромиссом ради производительности, требований клиентов и ограничений реализации в реальном мире. В этом случае «чистый» способ звучит как одна большая таблица, и если вы не собираетесь добавлять атрибуты все время или иметь определенные пользователем атрибуты, это, вероятно, так, как я это сделал. Если бы я обнаружил проблемы с производительностью с этой дорожкой, я бы разделил ее на подтаблицы, если мне это нужно. –

+0

Думаю, я понимаю. Благодарю. –

2

PostgreSQL хранит строки в так называемых страницах данных размером 8 КБ. Вы можете думать об этом как о кодах с ограниченным размером. Недостатком для широких рядов является то, что база данных может помещаться на строке данных меньше строки. Для механизма базы данных быстрее вернуть 1000 строк с одной страницы, чем приносить 1000 строк, которые распространяются на несколько страниц. В этом случае один читается против 1000 с диском IO, являющимся вашим врагом. Это то, о чем нужно знать, чтобы этого не избежать. Часто нужны широкие столы, которые вы можете прожить с накладными расходами. В вашем случае вы будете использовать 240 байт в строке примерно (4 байта на целое число * 60 строк).

+0

Вы имеете в виду 240 байт? Таблица ключевых строк - хорошая идея для хранения данных. Но мне нужно выполнить тяжелые запросы. Как вы справились с этим? Где ключ к этому, и стоит ли это делать? –

+3

Этот метод называется [«Значение атрибута сущности»] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) и обычно рассматривается как анти-баттон или даже время выполнения. Позднее из-за того, что во время тестирования (обычно с небольшими наборами данных) все в порядке, pruduction _start_ fine (небольшая таблица, все кортежи одного родителя находятся на одной странице ...), но в будущем сильно ухудшается. И к тому времени таблица будет большой, чтобы выполнять регулярную реорганизацию (из-за ограничений по времени). –

+0

Он становится уродливым, когда вы пытаетесь выполнить условные запросы по нескольким атрибутам. Вы получаете ужасные неэффективные списки многих и многих объединений. Это считается анти-шаблоном по какой-то причине. Не говоря уже о том, что вы не должны использовать его иногда, стоимость/выгода нужно тщательно взвешивать. –

Смежные вопросы