应该使用什么数据库结构来包含多个类别的表行?

时间:2013-06-04 16:01:16

标签: mysql database-design tagging

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

ID   |   Place   |   Phone   |   Email   |   Category 

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

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

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

CONTINUATION:我不认为有人可以帮助我为我的PHP制定“插入”命令吗?

4 个答案:

答案 0 :(得分:4)

这称为n m关系。

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

以下是如何建模的。

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)上拥有唯一索引。这允许您查找给定地点的所有类别。

答案 1 :(得分:1)

您需要一个Catagories表和一个Place_category表。

Catagories表将类似于:

Category_ID int,
Category_Name varchar

Place_category表应该是:

Category_ID int
Places_ID int

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

答案 2 :(得分: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

答案 3 :(得分:0)

只需使用包含2列的新表:

1列,标题为“Lakeside Picnic area” 1列,用于类别ID

多个类别会导致该表中的多行,具有相同的商品ID但具有不同的类别ID。

通过这种方式,您可以轻松检索给定类别的所有项目以及给定项目的所有类别。您尝试表示的内容称为多对多关系,因为每个类别可以包含多个项目,并且每个项目可以包含多个类别。