2

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

我有一个带有两个表的 mysql 数据库,在第一个表中我需要对第二个表进行多次引用。我应该使用什么?我可以使用 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  |
|========================================================

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

非常感谢您的帮助!

4

2 回答 2

1

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

您的主表有 (id, date, name) 您的 components 表有 (id, name, info) 您的 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>
于 2013-09-19T09:50:09.960 回答
0

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

应该怎么走?main表中的每一行是否有很多行,component反之亦然?

一对多关系意味着将外键添加到 many 表并将两者连接起来:

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

这会将主表中的所有行与其对应的组件匹配。

于 2013-09-19T09:48:54.943 回答