我有两个表,我试图做一个输入,用户可以搜索一个类别,例如比萨,数据库将找到该类别内的所有餐馆。我最初的想法是使表类别中的类别字段的id成为与餐厅表类别字段匹配的主键。然而,我遇到的问题是,一家餐厅只能有一家。什么是我所要求的最好的配置。
餐厅表
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| idRestaurant | int(11) | NO | PRI | NULL | |
| Name | varchar(45) | YES | | NULL | |
| Password | varchar(45) | YES | | NULL | |
| Email | varchar(45) | YES | | NULL | |
| Number | varchar(45) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
类别表
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| idCategories | int(11) | NO | PRI | NULL | |
| Category | varchar(45) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
您正在寻找一个连接表作为restaurant_categories
,它将维护餐馆有多个类别的关系
restaurant_categories
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| idCategories | int(11) | NO | | NULL | |
| idRestaurant | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
这样你就可以为一个餐厅分配多个类别,你可以在你的桌子之间使用简单的连接来搜索
select distinct r.* from Restaurants r
join restaurant_categories rc on(r.idRestaurant = rc.idRestaurant )
join Categories c on (c.idCategories =rc.idCategories )
where c.Category ='pizza'
您需要另一个表来存储餐馆和类别之间的关系。这个新表应该有两个字段:
Restuarant_id, category_id
这样,您就可以为属于餐厅的每个类别存储一行。
让一个表(restaurants.category_id
)的外ID键对应另一个表(categories.id
)的主字段是实现1:N关系的常用方法。在这种情况下,你会说"餐馆属于一个类别"或者"类别有许多餐馆"(你可以经常从Rails开发人员那里听到这些术语)。
如果您希望能够将多个类别分配给餐馆,并将多个餐馆分配给一个类别,则它是一个N:N关系("拥有并属于许多"),为此您需要第三个表,通常称为连接表或关系表。在原始表中,你只需要它们各自的主id;新表将有两个外键来将餐馆与类别(restaurant_categories.restaurant_id
和restaurant_categories.category_id
)配对。
如何定义Access数据库中表之间的关系
读这个。
为什么不直接在表'Restaurants'中添加一个字段categoryId呢?
你将能够做这样的请求:
SELECT idRestaurant FROM RestaurantTable WHERE categoryId = 1
有了这个结构,如果你想按类别进行研究,你可以这样做:
SELECT r.Name FROM categories as c
LEFT JOIN restaurants as r ON r.categoryId = c.idCategories
WHERE c.Category LIKE '%Pizza%'
添加第三个表,命名为RestaurantsCategories
+--------------+-------------+------+------------------------
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+------------------------
| idRestCat | int(11) | NO | PRI | NULL | |
| idRestaurant | int(11) | NO | | | |
| idCategories | int(11) | NO | | | |
+--------------+-------------+------+-----+---------+-------+