Привет всем, у меня есть этот вопрос, который постоянно поднимается с точки зрения лучших практик.
Допустим, у меня есть следующая таблица:
[Process]
----------------
ProcessID int
ProcessName varchar(100)
...
В дополнение к полям выше, скажем, [Process]
может иметь различные состояния. Это может быть в настоящее время успешно, в настоящее время неудачно, или ни один. Теоретически это может быть и то и другое, но мы не будем об этом беспокоиться. Мы также должны знать, КОГДА это состояние было в последний раз обновлено.
Мой вопрос: как лучше всего представить это состояние в структуре данных? Я могу придумать несколько вариантов:
(1) Добавьте столбец с именем State (bit, null)
, то есть 1
для успешного, 0
для неудачного и NULL
для ни одного. Затем мы добавляем столбец LastStateChangeDateTime (datetime, null)
, который сообщает нам, когда бит State
был изменен в последний раз. Мне никогда не давали прямого ответа на вопрос, является ли этот тип использования бит плохой идеей.
(2) Мы добавляем два столбца с именами HasState (bit, not null)
и CurrentState (bit, not null)
и снова наш столбец LastStateChangeDateTime (datetime, null)
. Это немного убирает использование «трех состояний», но кажется неуклюжим и запутанным.
(3) У нас есть две пары столбцов IsCurrentlySuccessful (bit, not null)
и SuccessBeginDateTime (datetime, null)
вместе с IsCurrentlyFailing (bit, not null)
и FailureBeginDateTime (datetime, null)
. Это делает два состояния независимыми друг от друга.
(4) Нет битов, только datetime: SuccessBeginDateTime (datetime, null)
и FailureBeginDateTime (datetime, null)
. Мы определяем состояние на основе даты и времени сами. Я чувствую, что это приведет к неэффективным запросам и / или индексам.
Я знаю, что приведенный выше пример надуман, но есть ли у кого-нибудь хорошие решения относительно того, как эффективно решить эту небольшую проблему со структурой данных? Помните, что на практике эти «состояния» не обязательно являются взаимоисключающими, поэтому не будет конца света, если структура данных будет разрешена для обоих состояний одновременно.
Спасибо!