Если у меня несколько типов объектов, когда object.type должен быть строкой, а когда - внешним ключом? - PullRequest
2 голосов
/ 17 июня 2009

Допустим, у меня есть книги, которые могут быть романсами, вымыслом или тайной. У меня есть 2 реалистичных варианта для хранения этих данных. Во-первых, в моей таблице книг должен быть столбец типа, представляющий собой строку со значением «романс», «фантастика» или «тайна». Другой - создать таблицу book_types и хранить там типы. Тогда мои книги будут иметь внешний ключ type_id, ссылающийся на таблицу book_types.

Мой вопрос: как выбрать лучший? Я видел строковый метод, используемый в плагине Rails с проверкой подлинности, который содержит информацию о состоянии пользователей - «неактивный», «активный», «ожидающий» ...

Есть ли снижение производительности при использовании метода справочной таблицы, учитывая, что я буду постоянно запрашивать эту информацию?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 17 июня 2009

Подход с использованием внешнего ключа будет работать лучше. Сравнение строк замедлит процесс. Гораздо быстрее сравнивать числа.

Если вы хотите еще больше ускорить запросы, добавьте индекс для столбца, который вы используете для ссылки на внешний ключ. В отличие от первичных ключей, индексы не создаются автоматически для внешних ключей.

1 голос
/ 17 июня 2009

В большинстве случаев лучше использовать подход с внешним ключом к отдельной таблице - преимущества:

  • Отдельная таблица дает вам расширяемый способ проверки записи. Ввод жестко-проверочного ограничения в определение таблицы затем требуется ALTER TABLE, чтобы добавить новый тип

  • Если вам по какой-либо причине понадобится изменить текст шрифта (например, «романс» -> «женская беллетристика» для неудачного примера), у вас будет только легкое обновление таблицы поиска.

  • Можно предположить, что у вас могут быть типы, для которых еще нет записей, а отдельная таблица позволяет использовать внешнее соединение для включения типа в наборы результатов SQL.

  • С точки зрения интерфейса отдельная таблица позволяет легко создавать выпадающий список типов, которые не требуют жесткого кодирования в пользовательском интерфейсе.

Что касается производительности, то при надлежащем индексе FK любой механизм СУБД будет работать хорошо - соединения - это то, для чего предназначена СУБД.

1 голос
/ 17 июня 2009

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

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

0 голосов
/ 17 июня 2009

Я бы использовал fk. Меньше информации дублируется.

EDIT: Лучшее решение: MySql код:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
...