MySQL表之间的多个引用

时间:2013-09-19 09:44:58

标签: mysql sql database-design enums

这个问题可能很容易回答,但由于我在数据库设计方面没有太多经验,所以我被困住了。我甚至不知道如何谷歌这个因为我不知道术语....

我有一个带有两个表的mysql数据库,在第一个表中我需要对第二个表进行MULTIPLE引用。我该怎么用?我可以选择与Enum的多个匹配项吗?或者我应该使用逗号分隔列表和varchar?

|MAIN TABLE 
|==========================================
| id (primary index)
| date (tstamp)
| product name (varchar)
| componentids (int, enum, varchar ???)
|===========================================


|COMPONENTS TABLE
|===========================================
| componentid (int)
| name (varchar)
| info (varchar)
|===========================================

所以可能出现这种情况:

|MAIN TABLE 
|=====================================================
| id             | 1              | 2                |
| date           | 34958734958    | 349587123138     |    
| product name   | A test product | A second product |
| componentids   | 2,3            | 1,2              |
|=====================================================


|COMPONENTS TABLE
|========================================================
| componentid | 1           | 2           | 3           |
| name        | Component 1 | Component 2 | Component 1 |
| info        | info. text  | info. text  | info. text  |
|========================================================

如何以有效的方式实现这一目标?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你所追求的是多对多的关系。每个组件可以属于多个产品,每个产品可以有多个组件。我强烈建议使用第三个表格,也许称为product_components。

你的主表有(id,date,name) 您的组件表有(ID,名称,信息) 您的product_components表有(product_id,component_id)。每个都是一个外键,分别引用主表和组件表。

这维护了“参照完整性”,这意味着产品无法引用不存在的组件(例如,如果您尝试,数据库将引发错误)。

是的,您可以通过这种方式选择与一种产品相关的多个组件。

SELECT components.* 
FROM components 
JOIN product_components  
ON components.id = product_components.component_id
WHERE product_components.product_id = <some product id>

答案 1 :(得分:0)

没有以逗号分隔的列表或varchar。那不是关系方式。

该怎么办? main表格中的每一行component都有很多行,反之亦然?

一对多关系意味着将外键添加到许多表并加入两个:

select *
from main
join component
on main.componentid = component.componentid

这将匹配主表中的所有行及其组件对应部分。