我的 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的请求会很慢...
如何处理?
答案 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;