Сколько столбцов слишком много столбцов?
Я заметил, что многие здесь приводят таблицы с 20+ (я видел до 55) столбцами в одной таблице. Сейчас я не претендую на звание эксперта по проектированию баз данных, но я всегда слышал, что это ужасная практика. Когда я вижу это, я обычно предлагаю разделить на две таблицы с отношением один к одному: одна содержит наиболее часто используемые данные, а другая - наименее часто используемые. Хотя в то же время возможна проблема производительности (меньше JOIN и тому подобное). Итак, мой вопрос заключается в следующем:
Когда речь идет о действительно БОЛЬШИХ масштабных базах данных, есть ли преимущество в наличии большого количества столбцов, несмотря на тот факт, что это обычно приводит ко многим значениям NULL?
Что больше сказывается на производительности: много столбцов с большим количеством NULL или меньше столбцов с большим количеством JOIN?
10 ответов
Дизайн таблицы зависит от сущности, которую необходимо хранить. Если все данные принадлежат друг другу, то 50 столбцов (или даже 100) могут быть правильными.
Пока таблица нормализована, не существует большого правила относительно размера, кроме возможностей базы данных и необходимости оптимизации.
Я согласен с Одедом. Я видел таблицы с 500 столбцами в них, и все столбцы в них были в правильном месте. Просто подумайте о количестве фактов, которые можно пожелать хранить о повседневном предмете, и вы скоро поймете, почему.
Если оказывается неудобным выбрать все эти столбцы или указать, какие столбцы выбрать, если вас интересует только небольшая их часть, вы можете найти целесообразным определить представление.
Сколько столбцов слишком много столбцов?
Когда вы чувствуете, что это больше не имеет смысла или правильно добавить еще один столбец.
Как правило, зависит от приложения.
Наличие слишком большого количества столбцов приводит к большому количеству пустых значений (зла) и громоздкому объекту, на который отображается таблица. Это ухудшает читабельность в IDE и затрудняет обслуживание (увеличивая затраты на разработку). Если вам нужно быстрое чтение, в некоторых случаях используйте денормализованные таблицы, например, используемые исключительно для отчетов или запросов (найдите шаблон "CQRS"). Да, "Person" имеет миллион атрибутов, но вы можете разбить эти монотильные таблицы (дизайн предшествует нормализации), чтобы соответствовать меньшим объектам ("адрес", "телефон", "хобби") вместо добавления новых столбцов для каждого нового варианта использования. Наличие меньших по размеру объектов (и таблиц) дает так много преимуществ; они включают такие вещи, как модульное тестирование, ООП и SOLID.
Кроме того, что касается объединения множества столбцов во избежание объединений, я думаю, что выигрыш в производительности от избежания объединений теряется из-за обслуживания индекса, принимая во внимание типичную рабочую нагрузку как чтения, так и записи. Добавление индексов к полям ради производительности чтения может указывать на необходимость перемещения этих полей в их собственную таблицу.
odbc имеет ограничение на количество символов 8000 .... так что это физический предел, за пределами которого вещи становятся очень неприятными.
Я работал над таблицей, в которой было 138 столбцов... это было ужасно написано и могло быть нормализовано. Хотя эта база данных, похоже, была создана кем-то, кто задавался вопросом, почему существуют соглашения в дизайне базы данных, и решил протестировать их все сразу.
Наличие очень широких плоских таблиц довольно распространено, когда вы переходите на хранилища данных и серверы отчетов. Они намного быстрее и означают, что вам не нужно хранить базу данных в оперативной памяти для повышения производительности.
Это также сильно зависит от варианта использования вашего стола. Если вы хотите оптимизировать его для чтения, то было бы неплохо сохранить все это в одной таблице.
В мире NO-SQL (например, cassandra/hbase) нет ограничений на количество столбцов, и фактически рекомендуется иметь много столбцов. Это также происходит от того, как он хранится (без пробелов). Стоит при расследовании.
Согласно моему опыту, лучше иметь меньше соединений, так как они, как правило, происходят слишком часто, особенно в большой базе данных. Пока ваши таблицы базы данных предназначены для хранения одного объекта (ученик, учитель и т. Д.), Все должно быть в порядке. Так что это будет представлено как объект в вашем коде позже. Таким образом, если вы разделите сущность на несколько таблиц, вам придется использовать несколько объединений, чтобы заполнить ваш объект позже. Кроме того, если вы используете ORM для создания своего уровня доступа к данным (например, Linq в.Net), он будет генерировать отдельные классы для каждой таблицы (конечно, с отношением между ними, но все же), и это будет сложнее использовать.
Другое дело, что вы можете указать, какие столбцы возвращать в вашем запросе, и это сократит объем данных, передаваемых вашему приложению, но если вам понадобится хотя бы один столбец из другой таблицы, вам придется выполнить соединение. И в большинстве случаев, поскольку у вас так много столбцов, вероятность того, что большой объем данных будет храниться в БД, высока. Так что это соединение повредит больше, чем NULL.
Каждый проект, над которым я работал, индивидуален, поэтому вы должны найти баланс для каждой истории.
Что больше сказывается на производительности: много столбцов с большим количеством NULL или меньше столбцов с большим количеством JOIN?
Это зависит только от данных, которые вы храните, индексов и т. Д. Никто не может гарантировать вам, что один работает лучше, чем другой, не зная, что вы храните. Обычно правила нормализации "заставят" вас разделять данные на разные таблицы и пользовательские клавиши, если у вас большая таблица, но я не согласен с тем, что она ВСЕГДА работает лучше, чем одна большая таблица. Вы можете закончить соединениями 6-7 уровней в десятках запросов, которые иногда приводят к ошибкам, потому что гораздо больше шансов создать ошибку в более крупных запросах, чем в простых.
Если вы опубликуете некоторые требования к тому, что вы делаете, возможно, мы поможем вам правильно спроектировать БД.
Какая бизнес-потребность требует более 60 столбцов в любом наборе данных, не говоря уже о таблице TSQL? Если есть такая бизнес-потребность, то Сводка в порядке, и столбцы должны быть строками. Например, в горнодобывающей промышленности в анализе может быть проведено 600 различных измерений. Имя каждого измерения может быть именем столбца. Но зачем создавать таблицу с 600 столбцами и строками измерений? Возможно, геолог каждый день измерял бы шахту и заполнял журнал из 600 столбцов в одном ряду. Для меня это звучит так, будто геолог сойдет с ума, и он не найдет лист бумаги достаточно долго. Возможно, рулон сработает, но тогда ему придется развернуть рулон и снова свернуть его.
Лучше использовать одну таблицу, где вы можете избежать использования объединений, при этом запрос к ней зависит от того, являются ли столбцы одной и той же сущностью или другой сущностью.
Например, предположим, что вы разрабатываете базу данных для рабочего процесса, где некоторые поля будут редактироваться младшими работниками, а некоторые - старшими работниками. В этом случае лучше иметь все столбцы в одной таблице.