我在MySQL数据库中有一个包含各种数据的表(为了举例,我们给它以下内容:
ID | Place | Phone | Email | Category
现在,我想重新设计“类别”部分,以便能够在多个(可搜索的)类别中包含任何给定的行。
例如,假设有一个叫做“湖滨野餐区”的地方。目前它被归类为“自然保护区”。因此,当人们搜索自然保护区时,它会在搜索结果中显示。但是,我也希望它出现在“食品区”,“野生动物”和“观点”中。
我的问题是:如何设计我的表/数据库结构以允许所有数据条目/行可以按多个类别进行搜索?
CONTINUATION:我不认为有人可以帮助我为我的PHP制定“插入”命令吗?
答案 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。
通过这种方式,您可以轻松检索给定类别的所有项目以及给定项目的所有类别。您尝试表示的内容称为多对多关系,因为每个类别可以包含多个项目,并且每个项目可以包含多个类别。