Каждый раз, когда у вас есть различные состояния, которые являются «взаимоисключающими», это подразумевает наличие одного столбца с несколькими возможными значениями для этого столбца. В большинстве случаев эти значения должны быть ограничены, и одним из лучших и наиболее распространенных способов сделать это является использование внешнего ключа для таблицы «словарь» или «поиск». Таким образом, на самом базовом уровне у вас может быть что-то вроде этого:
- Таблица заказов (OrderID, OrderStatusID, ...)
- Таблица OrderStatus (OrderStatusID, Имя)
OrderStatus будет иметь такие значения, как:
* 1, «Платный»
* 2, «Неоплаченный»
* 3, "Отправлено"
* 4, «Не отправлено»
Важной частью является определение того, какие статусы действительно взаимно исключают другие статусы. Например, приведенные выше примеры строк, вероятно, не очень хороши, так как вы могли бы иметь заказ, который был бы «оплачен» и «отправлен». Если это так, то вы можете разделить OrderStatus на PaymentStatus и ShippingStatus (как вы намекали).
Определение того, действительно ли разделять эти строки, зависит от вас и ваших конкретных потребностей. Однако, что бы вы ни решили, предположим, что вам придется изменить его в какой-то момент. Обычно единственными приложениями / базами данных, которые никогда не изменяются, являются сбой , которые были оставлены из-за отсутствия использования. «Правильно понять это с первого раза» - замечательная цель, и заблаговременное проведение вашего исследования является оправданным, но вы почти наверняка не достигнете этого. Вместо этого тратите свои усилия на то, чтобы сделать остальную часть вашего дизайна / кода достаточно гибкой и изменяемой, чтобы вы могли переделывать ее части без необходимости разрушения всего приложения.