Моделирование данных - как обрабатывать два зависимых столбца статуса? - PullRequest
1 голос
/ 20 июля 2009

Я столкнулся с чем-то, что меня беспокоит, настолько, что я захотел приехать сюда и получить от вас, парни (et gals), своего рода «лучшие практики»

В моей модели есть таблица, назовем ее prospect. Две отдельные внешние системы могут предоставлять обновление для строк в этой таблице, но только как «статус» этой записи в этих соответствующих системах.

Мне нужно хранить эти статусы локально. Первоначальная идея, конечно же, просто сделать два внешних ключа, которые могут обнуляться. Как то так.

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| prospect_id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| ext_status_1_id | int(11)      | YES  |     | NULL    |                |
| ext_status_2_id | int(11)      | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

В этом примере, конечно, будут две таблицы, в которых содержатся пары идентификатор / значение для статусов.

Вот загвоздка - ext_status_2_id будет всегда быть NULL, если ext_status_1_id не равно 1 (именно так работают бизнес-правила).

Правильно ли я смоделировал это? Просто у меня в голове звучит этот ноющий голос, говорящий мне, что «не каждый ряд в будущем будет нуждаться в ext_status_2_id, так что это может быть неправильно».

Если это имеет значение, это MySQL 5.0.45, и я использую InnoDB

Ответы [ 3 ]

4 голосов
/ 20 июля 2009

Поскольку существует встроенная зависимость Status2 от Status1, почему бы просто не иметь одно поле состояния в таблице проспектов и создать Status2 как свойство в таблице Status1? Это, безусловно, сильно нормализуется таким образом, но такая структура данных говорит о зависимости Status2 от Status1.

1 голос
/ 20 июля 2009

Это, наверное, хорошо. Но так как вы всегда будете использовать только 1 из 2, вы можете смоделировать его как:

ext_status_type (1 или 2) и ext_status для фактического идентификатора.

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

Если будет больше статусов (3,4,5,6), я бы рассмотрел первый подход в своем ответе.

0 голосов
/ 24 июля 2009

Каковы возможные ext__status__1? Будет ли ext__status__2 иметь значение, только если status__1=1? Что такое status__1=2? Я частично согласен с Nissan Fan. Однако существует ли прямая зависимость между status__1 и Status__2? Существует ли функциональная зависимость вида status__1 -> Status__2?
Если такой зависимости нет, то сохранение status__1 и Status__2 в отдельной таблице не решит вашу проблему.

...