3

我正在建立一个网站,您可以在其中添加具有多个类别的项目。

在一个字段中存储多个类别并仍然保持该字段可搜索的最佳方法是什么?

4

5 回答 5

8

您不会在一个字段中存储多个类别,而是创建一个单独的表来为每个项目分配类别。与此类似:

-- create your table to store items/products
create table items
(
  id int,  -- this will be the PK
  name varchar(10)
);

insert into items values
(1, 'product1'),
(2, 'product2');

-- create your table to store categories
create table categories
(
  id int,  -- this will be the PK
  name varchar(50)
);

insert into categories values
(1, 'color'),
(3, 'material'),
(6, 'size');

-- create your join table to assign the categories to each item
-- this table will have a foreign key relationship to the items and categories table
create table items_categories
(
  item_id int,   -- both fields will be the PK
  category_id int
);

insert into items_categories values
(1,  1),
(2,  3),
(2,  6);

然后,您将通过连接表来查询数据:

select i.id itemid,
  i.name item,
  c.name category
from items i
left join items_categories ic
  on i.id = ic.item_id
left join categories c
  on ic.category_id = c.id

请参阅带有演示的 SQL Fiddle

于 2012-10-11T10:19:22.223 回答
1

最好的方法是不要“在一个字段中存储多个类别”。

相反,为 ItemCategories 设置一个单独的表。

阅读有关数据库规范化和内心消化的信息。

于 2012-10-11T10:18:46.907 回答
1

您可以构建一个关系表item-category,就像它只存储类别 ID 和项目 ID。然后您可以直接将您的搜索查询放在关系表上。确保它也有自己的主键。

于 2012-10-11T10:18:52.537 回答
0

您不应该尝试将所有类别存储在一个字段中,这就是“关系表”的用途,您应该像这样构建表:

product_categories (
    `id` INT AUTO_INCREMENT,
    `product_id` INT NOT NULL,
    `category_id` INT NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY (`product_id`, `category_id`)
)

通过这种方式,您还可以添加FOREIGN KEY哪些将负责更改、删除等。

于 2012-10-11T10:19:10.533 回答
0

在单个条目中存储单独的项目很少是一个好主意。

但是,如果您真的坚持这一点,那么最好将您可能存储为数组的类别序列化,例如使用json_serialize. 然后使用 sqlsLIKE运算符搜索数据库。

于 2012-10-11T10:20:22.587 回答