Сколько полей в таблице «слишком много»?

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

Изменить: Кроме того, многие поля относятся к типу параметров (например, в форме запроса, хотите ли вы, чтобы ваш виджет был желтым или зеленым, у него есть поле для «цвета» с перечислением). Вполне вероятно, что со временем они будут добавлены или удалены. Я на самом деле не занимался проектированием базы данных и сам стараюсь держаться от него подальше, так что, может быть, я веду себя совершенно глупо, но, конечно, есть способ сделать это лучше ??


person franzferdinand    schedule 21.10.2008    source источник


Ответы (12)


Самый очевидный признак того, что таблица требует нормализации, - это поля, оканчивающиеся целыми числами: CouponCode1, CouponCode2, CouponCode3 ... вы понимаете. Но, как всегда, будут исключения из правил.

person Chris Missal    schedule 21.10.2008
comment
Если вы знаете какое-либо исключение из этого правила, не стесняйтесь его развивать. Я никогда не встречал такого исключения - person Philippe Grondier; 21.10.2008
comment
Первое, что приходит на ум, - это что-то вроде столбца AddressLine. У меня нет проблем с AddressLine2 в качестве имени столбца. При желании вы можете использовать AdditionalAddressLine или что-то подобное, но, как я уже сказал, в этом исключении я согласен. - person Chris Missal; 21.10.2008
comment
Один из моих коллег всегда говорил: «Правило большого пальца для баз данных» - «Вниз всегда лучше»! - person Raj More; 22.07.2009

Таблицы базы данных могут иметь 30 или более полей. Вам нужно посмотреть на нормализацию данных и на то, имеет ли эта нормализация какой-либо смысл. Обычно это также изменится в будущем. Но вы должны попытаться свести это к минимуму.

Например, если у вас есть таблица с адресами, включаете ли вы в эту таблицу поля города, штата и почтового индекса? Или вы включаете только одно поле, которое «указывает» на запись в отдельной таблице для этих значений? Отдельная таблица будет содержать уникальные комбинации города, штата и почтового индекса. Разделение данных на две таблицы приводит к уменьшению объема хранимых данных (скорее всего, но не абсолютному), но к некоторой дополнительной сложности при выполнении запросов к базе данных. Теперь вам нужно иметь дело с двумя таблицами вместо одной. Но, с другой стороны, он намного чище и (вероятно) намного меньше.

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

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

person JR Lawhorne    schedule 21.10.2008
comment
Разделение адреса в отдельную таблицу имеет смысл только в том случае, если каждый адрес может использоваться более одного раза, но это очень маловероятно, если вы не усложняете свой интерфейс. Если каждый адрес используется только одним человеком, вы сделали вертикальное разбиение, а не нормализацию. - person Seun Osewa; 08.12.2008
comment
Я имел в виду разделение Zip, City, State на отдельную таблицу с внешним ключом в таблице адресов. Обычно очень вероятно, что несколько адресов будут иметь один почтовый индекс, связанный с ними и, следовательно, с городом и штатом. (Каждый почтовый индекс afaik связан только с одним городом и штатом.) Следовательно, если ваша адресная таблица огромна, может быть полезно нормализовать дублированные данные почтового индекса, города и штата в отдельной таблице. - person JR Lawhorne; 10.05.2009
comment
Почтовые индексы могут быть связаны с несколькими городами / штатами ... например, мой почтовый индекс (17402) - это Йорк, штат Пенсильвания, и Спрай, штат Пенсильвания. - person Beep beep; 12.05.2009
comment
@LuckyLindy Это интересно. Значит, вы получите письмо по этому почтовому индексу, независимо от того, в какой город оно адресовано? Как насчет ваших +4 цифры? - person JR Lawhorne; 15.05.2009

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

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

BaseTable:
    Id
    NonOptionFields
OptionTable:
    Id
    OptionName
    OptionValue

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

person paxdiablo    schedule 21.10.2008

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

Подумайте о данных, которые вы будете там хранить. Вероятно, что многие из этих полей будут NULL? Какова вероятность того, что эти поля изменятся (например, добавятся новые)?

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

refs (id, title, refType)
-- title of the reference, and what type of reference it is

fieldDef (id, fieldName, refType, dataType)
-- name of the field, which reference types it applies to, and
-- what type of data is stored in these fields (ISDN number, date, etc)

fields (refId, fieldId, value)
-- where you actually add data to the references.

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


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

person nickf    schedule 21.10.2008

нет произвольного ограничения; достаточно, чтобы выполнить работу - хорошее практическое правило

если у вас есть лучший дизайн БД, предложите это

если вам нужен более подробный отзыв, опубликуйте схему

person Steven A. Lowe    schedule 21.10.2008

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

person CNote    schedule 14.11.2008

Количество полей обычно не проблема, но вы хотите убедиться, что ваша база данных правильно норализована. Третья нормальная форма - хорошее начало.

person Milhous    schedule 21.10.2008
comment
BCNF лучше - и обычно то, что находится в 3NF, также в BCNF. - person Jonathan Leffler; 21.10.2008

OLTP

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

IMO 30 столбцов - это слишком много.

На мой взгляд, не более 10% моих OLTP-таблиц имеют большое количество (> 10) столбцов.

OLAP

Теперь, если вы собираетесь создать структуру измерений / отчетов, некоторые люди могут посчитать таблицу из 30 столбцов узкой.

person Raj More    schedule 22.07.2009

Если вам нужно спросить: «Слишком много полей в этой таблице?» Тогда, наверное, есть.

person Kon    schedule 21.10.2008

Руководство партизана по нормализации по умолчанию:

  1. Таблица должна иметь первичный ключ и не более одного другого столбца.
  2. Нарушайте правило номер 1 только настолько часто, насколько это необходимо.
person Apocalisp    schedule 21.10.2008
comment
Правило номер 1 - это 6НФ Дарвена и др., верно? Я видел, как Дарвен его нарушал (dbdebunk.com/page/page/3010532.htm < / а>). - person onedaywhen; 21.10.2008

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

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

Из соображений безопасности также часто предлагалось (давным-давно: я думаю, это была моя первая книга о реляционных базах данных, впервые опубликованная в 197?) Разделить конфиденциальную информацию в другой таблице с тем же отношением 0-1 между main и суб. После этого можно было легко ограничить доступ пользователей к «вспомогательной» таблице. Такой конфигурацией теперь можно легко управлять с помощью представлений.

person Philippe Grondier    schedule 21.10.2008

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

Я бы сказал, что для вашей БД «Эксперт» необходим курс по проектированию баз данных. И я бы посоветовал вам освежить его в памяти ... это может только помочь вам в карьерном росте :)

person Michael Brown    schedule 21.10.2008