Является ли чрезмерное использование пустых столбцов в базе данных «запахом кода»? - PullRequest
18 голосов
/ 24 июня 2009

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

Это нормальная практика в мире баз данных? Я просто скромный программист, а не администратор баз данных, но я думаю, вы захотите свести к минимуму пустые поля, только там, где они имеют смысл.

Является ли это "запахом кода", если большинство столбцов обнуляемы?

Ответы [ 17 ]

1 голос
/ 24 июня 2009

Это все полностью зависит от объема и требований проекта. Я бы не использовал количество пустых полей в качестве показателя для плохо написанного или разработанного кода. Посмотрите на бизнес-домен: если в базе данных представлено много необнуляемых полей, которые можно обнулять, то у вас есть некоторые проблемы.

1 голос
/ 24 июня 2009

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

0 голосов
/ 29 августа 2018

Как уже упоминалось, ввод данных на передней панели должен позволять пропуск многих полей. Это усложняется тем, как люди интерпретируют тринарную природу NULL (например, пустая или отсутствующая).

Поэтому я отвечаю только об одном аспекте проектирования базы данных: внешних ключах.

В общем внешние ключи не страдают от произвольного характера бизнес-логики, поэтому, видя, что эти столбцы, допускающие NULL, являются определенно запахом кода.

Например, если бы у вас была таблица [Person], ни в одной ситуации вы бы никогда не имели значение [Person].[FatherID], которое было бы NULL преднамеренно .

Для большой базы данных попытка сохранить NULL в таком столбце, вероятно, произойдет в какой-то момент из-за неизбежности ошибок, которые были бы обнаружены намного раньше при наличии ограничения NOT NULL. Поэтому для версии 1 или таблицы никогда не следует разрешать пустые столбцы без объяснения .

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

Кроме того, разработчики визуальных таблиц (например, в SQL Server Management Studio и Visual Studio) по умолчанию разрешают NULL, так что это может быть просто вопросом неадекватного просмотра кода.


Я не хочу пытаться получить правильный ответ для флаговых (т. Е. Логических) столбцов, но я настоятельно рекомендую рассмотреть вопрос о том, как их можно реализовать, не допуская NULL, поскольку я обычно находил способы избежать обнуляемости даже в условиях бизнес-логики.

0 голосов
/ 26 октября 2009

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

Есть одно исключение, ключи. Очевидно, что все первичные и внешние ключи должны принудительно существовать.

Приложение должно проверять данные, а база данных - просто хранить и извлекать то, что вы им даете. Наличие в ней логики проверки правильности процесса, даже такой простой, как null или not null, делает проект более сложным для обслуживания, так как различные правила распространяются на все.

0 голосов
/ 24 июня 2009

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

0 голосов
/ 24 июня 2009

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

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

0 голосов
/ 24 июня 2009

Один из многих способов отобразить наследование (например, объекты c #) в базе данных - это создать таблицу для класса в верхней части иерархии, а затем добавить столбцы для всех других классов. Столбцы должны иметь значение NULL, если в базе данных хранится объект другого подкласса. Это называется Отображение наследования одной таблицы (или Отображение иерархии в одну таблицу ) и является стандартным шаблоном проектирования.

Побочным эффектом сопоставления наследования в одной таблице является то, что большинство столбцов обнуляются.


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

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