Простая нормализация нормализации базы данных

StackOverflow https://stackoverflow.com/questions/3031169

Вопрос

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

У меня есть таблица клиентов с первичным ключом CustomerID. Он имеет столбец StatusCode, который имеет код, который отражает состояние учетной записи клиентов IE. 1 = открыть, 2 = закрыто, 3 = подвешенный и т. Д. ...

Теперь я хотел бы иметь другое поле в таблице клиента, которая флаги, если учетная запись разрешена приостановленным или нет ... Некоторые клиенты будут автоматически приостановлены, если они сломают там торговые условия ... Другие не ... Так Поля таблицы будет так:

Клиенты (CustomerID (PK): StatusCode: issuspensionalled)

Теперь оба поля зависят от первичного ключа, поскольку вы не можете определить статус или разрешены подвески на конкретном клиенте, если вы не знаете конкретного клиента, за исключением курса, когда в поле «Высыщение» установлено значение «Да», у клиента никогда не должно быть Статусный код 3 (приостановлен).

Кажется, из вышеуказанного дизайна таблицы возможно, чтобы это произошло, если для моего стола к моему столу не будет добавлено определенное значение. Я не вижу, как можно добавить еще один стол к реляционному дизайну, чтобы обеспечить это, хотя, так как только в том случае, если это только в том, что ISSUSPINDALLALD установлено значение «Да» и «Состояние», установлено значение 3, когда они имеют зависимость друг от друга.

Поэтому после моего долгосрочного объяснения мой вопрос: это проблема нормализации, и я не вижу реляционного дизайна, который будет применять это ... или это на самом деле просто деловое правило, которое должно быть применено с проверкой, и Таблица на самом деле все еще нормализовано.

Ваше здоровье,

Стив

Это было полезно?

Решение

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

Create Table Customer   (
        CustomerId <datatype> not null Primary Key
        , StatusCode int not null
        , IsSuspensionAllowed int not null Default( 1 )
        , Constraint CK_Customer_IsSuspensionAllowed 
                    Check ( IsSuspensionAllowed In(0,1) )
        , Constraint CK_Customer_StatusCodeRange 
                    Check ( StatusCode Between 0 And ?? )
        , Constraint CK_Customer_StausCodeValid 
                    Check ( Case
                When StatusCode = 3 And IsSuspensionAllowed = 1 Then 0
                                                                Else 1
                                                                End = 1 )
        , ....
        )

Вы не упомянули тип данных PK, поэтому я просто вставил заполнитель. Если вы используете SQL Server, вы можете использовать немного столбец вместо int и проверьте ограничение, которое я упомянул выше (bit не является частью спецификации ANSI).

Это хороший пример того, где суррогатные ключи для таких вещей, как коды статуса, не всегда хорошо работают. Было бы лучше иметь строковые значения представляют собой коды состояния, в этом случае оператор Case будет читать When StatusCode = 'Suspended' And IsSuspendedAllowed = 0....

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

Кстати. Использование ваших данных, не должно быть государством, которое не разрешено быть StatusCode = 3 and IsSuspensionAllowed = 0?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top