1

我的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 做一个请求会非常慢......

如何处理?

4

1 回答 1

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;
于 2013-10-06T10:52:30.213 回答