0

我在 MySQL 数据库中有一个表,其中包含各种数据(为了举例,让我们给它以下内容:

ID   |   Place   |   Phone   |   Email   |   Category 

现在,我想重新设计“类别”部分,以便能够在多个(可搜索)类别中包含任何给定的行。

例如,假设有一个地方叫“湖边野餐区”。目前它被归类为“自然保护区”。因此,当人们搜索自然保护区时,它会显示在他们的搜索结果中。但是,我也希望它出现在“美食区”、“野生动物”和“视点”中。

我的问题是:如何设计我的表/数据库结构以允许所有数据条目/行可以通过多个类别进行搜索?

继续:我认为没有人可以帮助我为我的 PHP 制定“插入”命令,他们可以吗?

4

4 回答 4

4

这称为 nm 关系。

换句话说,一个地方可以有多个类别,一个类别有多个地方。

这是您将如何建模它。

Place
-----
Place ID
Place Name
Place Phone
Place Email

Category
--------
Category ID
Category Name

CategoryPlace
-------------
CategoryPlace ID
Category ID
Place ID

所有三个表都有一个自动递增的 int 或 long 主键。

CategoryPlace表将在(类别 ID、地点 ID)上有一个唯一索引。这使您可以找到给定类别的所有地点。

您还可以在(地点 ID、类别 ID)上有一个唯一索引。这使您可以找到给定地点的所有类别。

于 2013-06-04T16:07:16.733 回答
1

你需要一张Catagories桌子和一张Place_category桌子。

类别表将类似于:

Category_ID int,
Category_Name varchar

Place_category 表应如下所示:

Category_ID int
Places_ID int

然后,您将在 Place_category 表中为要分配给每个地点的每个类别输入一个条目。

于 2013-06-04T16:08:02.537 回答
1

你需要这样的设计:

Table: Places                                    Indexes:
+----+-----------+-------+------------------+    ID: Primary Key; Auto-Increment
| ID | Place     | Phone | Email            |    
+----+-----------+-------+------------------+
| 1  | Somewhere | 12345 | test@test.com    |
| 2  | SomePlace | 54321 | testing@test.com |
+----+-----------+-------+------------------+

Table: Categories                                 Indexes:
+-------------+-----------------+                 Category_id: Primary Key; Auto-Increment
| Category_id | Category_name   |
+-------------+-----------------+
| 1           | Test Category 1 |
+-------------+-----------------+


Table: Category_relationships                     Indexes:
+-------------+----------+-------------+          record_id: Primary Key; Auto-increment
| record_id   | place_id | category_id |          place_id: Foreign Key
+-------------+----------+-------------+          category_id: Foreign Key
| 1           | 1        | 1           |          place_id AND category_id: Unique
+-------------+------------------------+
| 1           | 2        | 1           |
+-------------+------------------------+

然后,如果您想检索地点 ID 1 的所有类别:

SELECT c.category_name 
FROM categories c 
INNER JOIN category_relationships cr 
    ON c.category_id = cr.category_id 
INNER JOIN places p
    ON cr.place_id = p.ID
WHERE p.ID = 1
于 2013-06-04T16:09:28.557 回答
0

只需使用具有 2 列的新表:

1 列用于您的项目“Lakeside Picnic area”的 ID 1 列用于类别 ID

多个类别将导致该表中的多行具有相同的项目 ID 但具有不同的类别 ID。

这样,您可以轻松检索给定类别的所有项目,以及给定项目的所有类别。您要表示的内容称为多对多关系,因为每个类别可以有很多项目,每个项目可以有很多类别。

于 2013-06-04T16:06:34.627 回答