MySQL столбец с различными типами - PullRequest
4 голосов
/ 26 ноября 2008

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

Подходы, которые я использовал в прошлом:

  1. Сохраняйте все как текст и преобразуйте в int (или что-то еще), когда это потребуется позже.

  2. Имеет два столбца - один для текста и один для int. Затем вы просто заполняете один ответ на строку в ответе, а второй оставляете пустым.

  3. Имеют две таблицы - одну для текстовых ответов и одну для целочисленных ответов.

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

Чтобы сделать это более конкретно, вот пример таблиц, которые у меня могут быть:

CREATE TABLE question (
  id int(11) NOT NULL auto_increment,
  text VARCHAR(200) NOT NULL default '',
  PRIMARY KEY ('id')
)

CREATE TABLE response (
  id int(11) NOT NULL auto_increment,
  question int (11) NOT NULL,
  user int (11) NOT NULL,
  response VARCHAR(200) NOT NULL default ''
)

или, если я воспользовался вариантом 2 выше:

CREATE TABLE response (
  id int(11) NOT NULL auto_increment,
  question int (11) NOT NULL,
  user int (11) NOT NULL,
  text_response VARCHAR(200),
  numeric_response int(11)
)

и если бы я использовал вариант 3, то были бы таблица responseInteger и таблица responseText.

Является ли какой-либо из этих подходов правильным или я упускаю очевидную альтернативу?

Ответы [ 3 ]

4 голосов
/ 26 ноября 2008

[Вариант 2] НЕ самый нормализованный вариант [как утверждает @Ray]. У большинства нормализованных полей нет полей, допускающих обнуляемость, и, очевидно, для варианта 2 в каждой строке потребуется значение NULL.

На этом этапе разработки вам нужно подумать об использовании, запросах, которые вы будете выполнять, отчетах, которые вы будете писать. Вы хотите сделать математику для всех числовых ответов одновременно? то есть, где numeric_response НЕ NULL? Вероятно, маловероятно.

Скорее всего, каков средний ответ, ГДЕ Вопрос = 11. В этих случаях вы можете выбрать либо таблицу INT, либо столбец INT, и ни один из них не будет легче сделать, чем другой.

Если бы вы делали две таблицы, вы, скорее всего, будете постоянно объединять их вместе для вопросов, например, какой процент вопросов имеет ответ и т. Д.

Можете ли вы увидеть, как вопросы, которые вы задаете в своей базе данных, начинают управлять проектом?

2 голосов
/ 26 ноября 2008

Я бы выбрал вариант 1. Ответы всегда являются текстовыми строками, но иногда текстовая строка оказывается представлением целого числа. Что менее просто, так это определить, какие ограничения, если таковые имеются, должны быть наложены на ответ на данный вопрос. Если какой-либо ответ должен состоять только из одной или нескольких цифр, как вы это проверяете? Скорее всего, таблица «Вопросы» должна содержать информацию о возможных ответах, и это должно направлять валидацию.

Отмечу, что комбинация QuestionID и UserID является (или должна быть) уникальной (для данной анкеты). Таким образом, вам действительно не нужен столбец автоинкремента в ответе. В любом случае у вас должно быть уникальное ограничение (или ограничение первичного ключа) для QuestionID и UserID (независимо от того, сохраняете ли вы столбец автоинкремента).

0 голосов
/ 26 ноября 2008

Вариант 2 - правильный, наиболее нормализованный вариант.

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