Дизайн базы данных MySQL: несколько значений в одном поле

#mysql #indexing

#mysql #индексирование

Вопрос:

Мне нужно создать индекс на 3 столбца:

 `gender` tinyint(1) NOT NULL default '0',
`age` tinyint(2) NOT NULL default '0',
`is_looking_for` varchar(30) NOT NULL default ''
 

Проблема в третьем столбце, который является VARCHAR, и этот индекс не будет использоваться. Я не могу сделать это INT. Каждый пользователь, который создает профиль на этом сайте знакомств, отвечает на вопрос «Я ищу ..», и он / она может выбрать несколько вариантов, например,
ищу мужчину
ищу женщину или пару (женщина женщина)
ищу мужчину или женщину, пару (мужчина женщина)

Теперь я сохраняю эту информацию в поле VARCHAR (is_looking_for) таким образом:

 1,3,5
 

и запрос MySQL выглядит следующим образом:

 select from profiles where gender='$gender' and age between $minage and $maxage 
and is_looking_for LIKE '%$lookingfor%';
 

Этот запрос очень плохой, но я не знаю, как решить эту проблему. Я не хочу создавать разные столбцы для каждого параметра пола — мужской, женский, пара (m f), пара (f f) и т. Д. Потому что тогда мне нужно создать несколько индексов — отдельный индекс для каждого пола:

 KEY `gender` (`gender`,`age`,`female`)
KEY `gender_1` (`gender`,`age`,`male`)
KEY `gender_2` (`gender`,`age`,`couple_male_female`)
 

и т.д.

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

Может кому-нибудь помочь? Спасибо.

Ответ №1:

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

 1. looking for male
2. looking for female
3. looking for male female
4. looking for ...
 

Затем другая таблица, которая связывает эту новую таблицу с вашей таблицей знакомств:

 date_id    looking_for_id
69         2
69         4
 

что означало бы, что дата # 69 ищет женщину или …

Комментарии:

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

2. Марк Б., не могли бы вы показать мне пример этого запроса объединения? Я не знаю, как присоединиться к 2 операторам. Выберите profiles.userid, profiles. ник из profiles присоединяется к lookingforTable в profiles.userid=lookingforTable.date_id где profiles.gender= ‘$gender’ и возраст между $minage и $maxage.

Ответ №2:

Вероятно, вам следует создать перечисление. Перечисление предназначено для этого.

Взгляните на документы: http://dev.mysql.com/doc/refman/5.0/en/enum.html

Комментарии:

1. Поскольку looking_for может иметь несколько значений, возможно set , более уместно, чем enum

2. изюминка, да, я мог бы использовать «SET», но нужно ли мне создавать многоколоночный индекс. Я думаю, что MySQL не будет использовать такой многоколоночный индекс: tinyint tinyint set . «SET» не является целым числом. Я ошибаюсь?