Как мне представлять группы записей, если не каждая запись является членом группы? - PullRequest
1 голос
/ 07 февраля 2011

Я создаю приложение, чтобы позволить студентам колледжа искать жилье.Моя модель включает в себя стол Room с размерами комнаты, независимо от того, зарезервирован ли он для персонала зала, и номер комнаты, помимо прочего.Однако некоторые номера участвуют в «люксах» по 2-8 номеров.Как мне смоделировать это?

Я рассматривал столбец suite_id в таблице Room, с NULL, позволяющим учитывать (большинство) комнат, которые не являются suite.Похоже, что должен быть более элегантный способ сделать что-то.

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

Любой совет будет высоко ценится!

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

Нет ничего неуместного в том, чтобы иметь suite_id, который можно обнулять. Это в основном говорит, что в вашей модели данных комната может быть частью пакета. Это прямое представление о ситуации и, следовательно, элегантно.

Альтернативы намного хуже. Подумайте на минуту, если хотите, как может выглядеть модель, если вы разделите комнаты на разные таблицы. Один для люксов, а другой для не люксов. Внезапно ваш критерий поиска должен пройти две таблицы. Вы реплицируете информацию по двум таблицам (если на самом деле разница только в одном идентификаторе). Это НЕ типично для проблемы, а просто приводит к большому труду и потенциальному снижению производительности двух поисковых запросов (предположительно в UNION) для получения ваших результатов. Да, и если вы добавляете общее свойство, вам нужно добавить его в двух местах и ​​выполнить все необходимые работы по обслуживанию, чтобы дважды распознать этот новый столбец.

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

Решение, к которому вы пришли, является правильным и надежным.

1 голос
/ 07 февраля 2011

Эта схема отлично работает.

Чтобы проверить, является ли комната частью набора, проверьте, является ли столбец пустым или нет в вашем приложении.

Чтобы запросить все комплекты, выберите строки WHERE suite_id IS NOT NULL и ограничьте размер GROUP BY suite_id HAVING COUNT(*) = number_of_rooms_you_want.

Хотя синтаксис может немного отличаться в зависимости от того, какую СУБД вы используете. Вы не пометили вопрос ни с чем.

0 голосов
/ 07 февраля 2011

Если комната может быть частью разных люксов, вы можете подумать о создании отдельного стола SuiteRooms (что может несколько отразить представление о том, насколько они сладкие).

...