Ниже приводится часть определения таблицы в SQL Server:базы данных Нормализация - поле в зависимости от другого неключевых поля
CREATE TABLE User
[UserId] INT NOT NULL IDENTITY(1,1),
[EatsFruit] BIT NOT NULL DEFAULT '0',
[FavoriteFruit] NVARCHAR(50) DEFAULT NULL,
Как вы можете себе представить, UserId является первичным ключом. Я использовал здесь более простой пример, чтобы объяснить мой вопрос, связанный с полями «фрукты».
Поле EatsFruit будет либо 1, либо 0, в зависимости от того, использует ли пользователь фрукты или нет. Если EatsFruit содержит 1, то поле FavoriteFruit будет включать любимые фрукты пользователя. Если EatsFruit равен 0, то FavoriteFruit не имеет значения, и он должен содержать N/A или некоторую аналогичную ценность.
Мне интересно, какой лучший способ смоделировать это, и нужно ли его нормализовать.
Поскольку поле FavoriteFruit зависит от содержания EatsFruit, следует ли его разделить в другой таблице, содержащей UserId и FavoriteFruit? Это было бы более чистым, потому что запись для определенного пользователя не появлялась бы, если пользователь фактически не ест фрукты (а содержание FavoriteFruit всегда будет актуальным). Однако, поскольку первичный ключ новой таблицы также был бы UserId, не означает ли это, что FavoriteFruit действительно зависит от UserId и не должен был быть отделен от основной таблицы в первую очередь?
Что было бы лучше всего здесь? Спасибо огромное!
Не имеет смысла перемещать его на другой стол. Как вы заявили, соотношение составляет 1: 1. И если вы не можете иметь более одного любимого фрукта, это просто свойство Пользователя. Я бы предположил, что вам не нужен nvarchar для имен фруктов, если они не будут введены на китайский или какой-либо другой язык. Также может быть хорошей идеей нормализовать ваши плоды на другой стол, чтобы избежать повторения. –
@SeanLange Я не видел 1: 1 часть. Но размер, соответствующий размеру поля? Как в случае с моим сотрудником? –
@SeanLange Спасибо, Шон. В этом случае вы не думаете, что было бы плохой дизайн иметь значения NULL для FavoriteFruit каждый раз, когда EatsFruit равен 0? – Irina