Каков наилучший способ хранения категориальных ссылок в таблицах SQL? - PullRequest
2 голосов
/ 06 июня 2010

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

Например, виджеты можно классифицировать как: круглые, квадратные, треугольные, сферические и т. Д. Должны ли эти категории храниться в таблице для лучшей ссылки на них из приложения? Я мог бы представить еще одну возможность - добавить столбец к виджетам, содержащим столбец формы, содержащий крошечное целое число. Таким образом, мое приложение может искать фигуры по этому, а затем использовать координирующий тип перечисления, который отобразит значения формы int.

Что было бы лучше? Или есть другое решение, о котором я пока не думаю?

Ответы [ 3 ]

3 голосов
/ 06 июня 2010

Определение таблицы категорий для каждой группы атрибутов.IE:

WIDGET_SHAPE_TYPE_CODES

  • WIDGET_SHAPE_TYPE_CODE (первичный ключ)
  • DESCRIPTION

Затем используйте ссылку внешнего ключа в WIDGETSтаблица:

WIDGETS

  • WIDGET_ID (первичный ключ)
  • ...
  • WIDGET_SHAPE_TYPE_CODE (внешний ключ)

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

1 голос
/ 06 июня 2010

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

При желании вы можете добавить таблицу категорий, содержащую числовое значение первичного ключа и текстовое описание. Это сопоставляет числовое значение с понятным для человека текстовым значением. Эта таблица может использоваться для преобразования чисел в текст, если вы просто хотите запускать отчеты непосредственно из базы данных. Приятно иметь эту таблицу в том, что вам не нужно обновлять исполняемый файл, если вы добавляете новую категорию. Я бы добавил такую ​​таблицу в свой дизайн.

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

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

0 голосов
/ 06 июня 2010

Я думаю, что лучший способ - использовать ENUM, например, есть предварительно определенный тип enum в mysql - http://dev.mysql.com/doc/refman/5.0/en/enum.html

...