MySQL数据库设计:同一领域中的多个值

时间:2011-10-25 16:33:20

标签: mysql indexing

我需要在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)等等,因为那时我需要创建多个索引 - 每个性别的单独索引:< / p>

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

我有一个想法是为每个可能的组合分配一个唯一的数字,然后将这个数字存储在INT字段中,但我放弃了,因为它太难了。

可以帮助别人吗?感谢。

2 个答案:

答案 0 :(得分:2)

规范化您的设计。创建一个单独的表,列出所有“查找”变量,每个变量都有自己唯一的ID。

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 :(得分:0)

你应该创建一个ENUM。 ENUM就是为了这个目的。

查看文档:{​​{3}}