Какой способ лучше реализовать в моей базе данных? - PullRequest
0 голосов
/ 06 мая 2011

Допустим, у меня есть таблица USER, и каждая моя база данных должна обрабатывать какой-то список ожидания.Список ожидания напоминает очередь с приоритетами (это не FIFO, есть значение, которое будет определять позицию в очереди).Я имею в виду наличие еще одной таблицы WAITINGLIST, содержащей два столбца, представляющих идентификаторы пользователя (внешний ключ) и приоритет пользователя в списке ожидания.Это хороший дизайн?Каждый раз, когда появляется вакансия, пользователь с наивысшим приоритетом будет обслуживаться и удаляться из списка WAITINGLIST.

Как называются отношения?Это один к одному?Но не все пользователи существуют в списке ожидания.

Это хороший дизайн?Я читал, что один-к-одному редко бывает хороший дизайн.Я также могу просто указать это значение приоритета в качестве другого столбца в USER, но, поскольку USER намного больше, чем WAITINGLIST, я думаю, что производительность будет намного лучше, если использовать WAITINGLIST (гораздо меньше строк для сортировки).

EDIT:приоритет не является каким-то ограниченным, дискретным значением, таким как (0 - 5, низкий - высокий), но это значение с плавающей запятой (результат некоторых вычислений), и один и тот же пользователь будет очень редко иметь такой же приоритет, поэтомупроблема здесь не в выборе, когда два пользователя имеют одинаковый приоритет.

Ответы [ 3 ]

1 голос
/ 07 мая 2011

Наличие таблицы WAITING_LIST не обязательно является плохим дизайном.Если единственное, что вам нужно знать о позиции списка ожидания является счет (и идентификатор пользователя), то это спорно.Если есть вероятность, что вы захотите сделать что-то еще со списком ожидания, например, дату и время добавления записи, есть ли какая-либо промежуточная информация о состоянии, например, код с надписью «ожидает оценки» или что-то в этом роде, тогдаСоотношение 1: 1 - вполне приемлемый дизайн базы данных.

Вы действительно должны быть осторожны с практическими правилами.Основное правило, гласящее, что отношения 1: 1 - это плохой дизайн, основано на том факте, что многие люди не знают, когда и как их правильно использовать.Когда вы имеете дело с подтипом, то 1: 1 совершенно нормально.

В вашем случае таблица WAITING_LIST является рабочим списком.Рабочий список вполне может быть интересен сам по себе, поэтому его моделирование как собственной таблицы вполне подойдет.Если у вас есть только один атрибут в этой таблице (оценка приоритета), тогда потребность в таблице слабая, но в любом случае наличие таблицы не является плохим, особенно если существует значительный риск того, что другие атрибуты могут быть добавлены позже, или еслиВы можете перейти в режим, в котором рабочий список не удаляется, а отслеживается для исторических целей, и в этом случае отношение может стать 1: многие.

0 голосов
/ 06 мая 2011

Если работать в Oracle, индекс USER.QUEUE_POSITION будет очень маленьким, поскольку пользователи, не стоящие в очереди на обслуживание, будут иметь значение NULL для USER.QUEUE_POSITION и, следовательно, не будут в индексе.

0 голосов
/ 06 мая 2011

А как насчет третьего столбца в таблице WAITINGLISt, в котором хранится метка времени при вставке строки?

Вы можете затем упорядочить по приоритету и метке времени, если 2 строки имеют одинаковый приоритет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...