用于多答案枚举的SQL DB设计

时间:2013-06-10 06:08:44

标签: php mysql sql database-design relational-database

有一个具有多个可能值的字段的有效设计是什么?

例如,

favorite_animals:狗,猫,鸟

possible_answers:蛇,蜥蜴,狗,仓鼠,猫,鸟

我想设置它以便查询很简单:

SELECT * FROM table WHERE favorite_animal='dog' OR favorite_animal='cat'
SELECT * FROM table WHERE favorite_animal='dog' AND favorite_animal='cat'

基本上,该字段的值可以是0或更多。

2 个答案:

答案 0 :(得分:2)

对于多个值,最有效的方法是使用第二个表来存储可能的值,使用第三个表来存储关联。

customers (id, name, gender ...)
animals (id, name) <-- one row for each animal
customer_animal_assoc (customer_id, animal_id)

如果客户有多个喜欢的动物,则关联表将存储多行。这是一种高效的normalized结构,可根据需要进行扩展。

查询可能如下所示:

SELECT
    c.name AS customer_name,
    a.name AS animal_name
FROM
    customer_animal_assoc caa
LEFT JOIN
    customers c ON c.id = caa.customer_id
LEFT JOIN
    animals a ON a.id = caa.animal_id
WHERE
    a.name = 'cat' AND a.name = 'dog'

答案 1 :(得分:1)

您可以使用IN子句检查它是否在给定集合中。

SELECT * FROM table 
WHERE favorite_animal IN ('dog', 'cat', 'bird');