У меня есть следующие таблицы:
Cateogories
Объекты
Существует ограничение внешнего ключа на Объекты. CategoryID. Существует шанс что, когда новый объект создается, что не будет никакой присвоенной категории.
Лучше установить Объекты. CategoryID для разрешения аннулирует, и соглашение с пустыми указателями в моем коде ИЛИ лучше не позволить аннулирует, установило CategoryID по умолчанию на 1, и создает фиктивную запись в таблице Categories под названием "Некатегоризированный" и затем имеет дело с той фиктивной категорией в моем коде?
Логически правильным способом было бы, чтобы столбец CategoryID был NULL, когда нет Category для данного элемента.
Если вы попадете в ловушку из-за любой из ловушек, связанных с использованием NULL, то это, скорее всего, признак того, что в дизайне не учтен тот факт, что изделие не может иметь категории. Исправьте дизайн. NULL гарантирует, что вы будете придерживаться решения правильной задачи.
.Это зависит от:
Если ваши объекты действительно не имеют категории, то я бы разрешил NULL
s, так как это то, что у вас есть: нет CategoryId.
Если вы хотите перечислить все категории, вы не хотите отображать фиктивный ряд, поэтому вам придется это проигнорировать.
Если вы хотите отобразить все элементы и показать категории, вам лучше знать, что есть элементы без категории, поэтому в этом случае вы должны использовать LEFT JOIN
.
Если возможно, измените свое приложение, чтобы выбрать категорию, прежде чем фактически сохранять элемент.
Если вы хотите, чтобы категория Uncategorized
рассматривалась так же, как и другие категории (перечислите их с другими категориями, подсчитайте присвоенные им элементы, выберите их в списках/открытиях), то она должна получить свою собственную категорию, а элемент.CategoryId должен быть NOT NULL
.
В идеале вы бы хотели форсировать выбор категории перед тем, как разрешить создание элемента. Если в будущем элемент не будет иметь категории, то вам нужно будет создать категорию специально для этого. Лично я бы не назвал ее "Uncategorized", хотя, поскольку это подразумевает, что пользователь может просто преследовать ее позже - что он забудет сделать с тревожной регулярностью!
Идите за логической последовательностью, иначе вы окажетесь в беспорядке. Если это означает создание категории "Разное", то сделайте это и убедитесь, что (a) пользователи знают, когда ее использовать и (b) о ней регулярно сообщается, чтобы удостовериться, что элементы правильно распределены по категориям.
.Для простых таблиц поиска такого типа почти всегда лучше запретить NULL и иметь неизвестное значение в таблице поиска.
Почему?
Однако, несколько предостережений:
SQL NULL - хитроумные, так что я думаю, что лучше с категорией sendinel.
.В данном случае я считаю, что это действительно вопрос личных предпочтений. В любом случае, вам придется иметь дело с некатегоризированными элементами в вашем коде.
Я не верю, что ни одна из альтернатив не очень хороша.
Если вы выберете NULL-подход, то у вас возникнут проблемы с получениями, связанными с работой с NULL. Если вы выберете не разрешать нули, вам придется обрабатывать случаи, когда при удалении категории элемент будет каскадироваться.
IMO лучшим вариантом является наличие трех таблиц.
Categories
ID
Name
Items
ID
Name
Categories2Items
CategoryID
ItemID
Это устраняет необходимость в NULL (и связанных с ним понятиях), а также позволяет иметь некатегоризированные предметы, а также предметы, принадлежащие нескольким категориям. Этот дизайн также находится в Boyce-Codd нормальной форме, что всегда хорошо ... en.wikipedia.org/wiki/BCNF