2

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

例如,

最喜欢的动物:狗、猫、鸟

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 个或多个答案。

4

2 回答 2

2

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

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

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

查询可能如下所示:

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'
于 2013-06-10T06:20:38.923 回答
1

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

SELECT * FROM table 
WHERE favorite_animal IN ('dog', 'cat', 'bird');
于 2013-06-10T06:13:01.523 回答