Mysql 数据库设计:使用多个选择存储多个选项的最佳方式

Mysql 数据库设计:使用多个选择存储多个选项的最佳方式,mysql,database,database-design,Mysql,Database,Database Design,因此,我试图确定实现这一点的最佳方式: 我会尽可能地简单,但要提供足够的信息 我有一个大数据集的数据库。在本例中,每辆车都是 有人在找你 我有一张桌子: CREATE TABLE cars ( `car_id` INT(10), `car_name` VARCHAR(20) ) 和选项表一样 CREATE TABLE `car_selected_options` ( `car_sel_id` INT NOT NULL AUTO_INCREMENT, `car_id`

因此,我试图确定实现这一点的最佳方式: 我会尽可能地简单,但要提供足够的信息

我有一个大数据集的数据库。在本例中,每辆车都是 有人在找你

我有一张桌子:

CREATE TABLE cars (
`car_id` INT(10),
`car_name` VARCHAR(20)
)  
和选项表一样

CREATE TABLE `car_selected_options` (
`car_sel_id`   INT       NOT NULL AUTO_INCREMENT,
`car_id`       INT       //the id of the car record created
`value`        INT       //id of info in a ref table
`key`          VARCHAR(20)   //from the car_option_reference,
)
例如:该值是ref表中更多信息的id(注2)

我需要找到所有红色的汽车id,并且有导航和收音机我正在做类似的事情:

SELECT distinct(c.car_id)
FROM `car` c 
   INNER JOIN `car_selected_options` AS o ON c.car_id = o.car_id
WHERE 
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'exterior_color' 
              AND so.value IN ('10' ) AND b.buyer_id = bm.buyer_id )
    AND
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'electronics'  
              AND so.value IN ('100','101' ) AND b.buyer_id = bm.buyer_id )
car_exterior_color (could have one entry per car or multiples if this person is ok with a red or a blue colored car)
car_interior_color 
car_electronics
或者,与其将键和所有内容放在一个表中,不如将每个键都放在一个选项中,每个选项都有单独的表,例如:

SELECT distinct(c.car_id)
FROM `car` c 
   INNER JOIN `car_selected_options` AS o ON c.car_id = o.car_id
WHERE 
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'exterior_color' 
              AND so.value IN ('10' ) AND b.buyer_id = bm.buyer_id )
    AND
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'electronics'  
              AND so.value IN ('100','101' ) AND b.buyer_id = bm.buyer_id )
car_exterior_color (could have one entry per car or multiples if this person is ok with a red or a blue colored car)
car_interior_color 
car_electronics
而不是执行这些多个子选择(可能是多个子选择),而是执行多个内部联接

我希望这是有道理的
感谢您的帮助,您发布的查询中似乎缺少了一些内容,因为我看不到“b”和“bm”表是什么。忽略该子句,您可以大大简化查询,而无需执行多个子选择:

SELECT c.car_id
FROM `car` c 
   INNER JOIN `car_selected_options` AS o ON c.car_id = o.car_id
WHERE 
   (o.key = 'exterior_color' AND o.value = 10) OR
   (o.key = 'electronics' AND o.value = 100) OR
   (o.key = 'electronics' AND o.value = 101) OR
GROUP BY c.car_id
HAVING COUNT(*) = 3;
本例中的“3”是您应用的标准数量。这里的诀窍是,对于每个匹配的汽车,您应该正好有三个匹配的行,因此,如果您按汽车id分组,并按计数(*)过滤=3,您将只选择符合所有条件的汽车