Mysql架构中的类别的多重排序

时间:2013-10-06 10:14:58

标签: php mysql sql

我的 Mysql MyISAM 表存在设计问题。

我的一张表包含“类别”列表(约100行)

id   |catcode      |name
-------------------------------
1     @01           lorem
2     @0101         ipsum
3     @02           dolor

另一张表包含'产品'。 (约28.000行)

id   |cats      |name      ...
---------------------------
1     @01@02     lorem     ...
2     @0101      ipsum     ...  
3     @02@0101   dolor     ...

在我的产品表中,我定义了它们所属的类别列表。

这是完美的,但现在:

我想根据所选类别自定义它们的排序。 目前,我的产品表中有一个类别为id的列,但这个接缝非常脏(ordering_1,ordering_2,ordering_3,...) 特别是因为每个产品只出现在2个或3个不同的类别中,因此大多数列都是空的:

 id   |cats      |name      |ordering_1    |ordering_2   |ordering_3  ...
    -----------------------------------------------------------------------
    1     @01@02     lorem      17                           12
    2     @0101      ipsum                     13            
    3     @02@0101   dolor                     21            8

我想使用第三个表来确定排序,但是如何?

基本思想是拥有一个包含类别和“排序”列表的表格,但其中一个列表包含所有产品! (主要类别)我认为在其中使用28.000 id的请求会很慢...

如何处理?

1 个答案:

答案 0 :(得分:1)

您应该使用外键和联接表来链接带有类别的产品,而不是catcode构造。

创建表结构,如下所示(示例适用于MySQL):

CREATE TABLE product (
  id INT NOT NULL,
  name VARCHAR(255),
  PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE category (
  id INT NOT NULL,
  name VARCHAR(255),
  PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE product_category (
  product_id INT NOT NULL,
  category_id INT NOT NULL,
  ordering INT NOT NULL,
  PRIMARY KEY (product_id, category_id),
  FOREIGN KEY (product_id) REFERENCES product (id),
  FOREIGN KEY (category_id) REFERENCES category (id)
) ENGINE=InnoDB;

然后,按照此类别的定义对特定类别中的所有产品进行排序,请按以下方式查询:

SELECT * FROM product p LEFT JOIN product_category pc ON p.id = pc.product_id
    WHERE pc.category_id = 1
    ORDER BY pc.ordering ASC;

1是此类别ID。您还可以按类别名称查询,例如:

SELECT * FROM product p
    LEFT JOIN product_category pc ON p.id = pc.product_id
    LEFT JOIN category c ON pc.category_id = c.id
    WHERE c.name = "foo"
    ORDER BY pc.ordering ASC;