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

StackOverflow https://stackoverflow.com/questions/1005384

Вопрос

Допустим, у меня есть книги, которые могут быть романтическими, художественными или детективными.У меня есть 2 реалистичных варианта хранения этих данных.Один из них заключается в том, чтобы в таблице my books был столбец type, представляющий собой строку со значением "романтика", "художественная литература" или "тайна".Другой способ заключается в создании таблицы book_types и сохранении в ней типов.Тогда у моих книг был бы внешний ключ type_id, ссылающийся на таблицу book_types.

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

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

Спасибо!

Это было полезно?

Решение

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

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

Другие советы

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

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

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

  • Отдельная таблица предоставляет вам расширяемый способ проверки записи.Ввод жестко запрограммированного ограничения проверки в определение таблицы затем требуется изменить ТАБЛИЦУ для добавления нового типа

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

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

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

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

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

Редактировать:Лучшее решение:Код MySQL:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top