我有两张桌子
table: people
id name goods_owned
1 john 1,4,3
2 Mike 2,5
3 Sam 1,5,2
4 Andy 5,3,4
Run Code Online (Sandbox Code Playgroud)
——
table goods:
g_id g_name g_class
1 sugar food
2 salt food
3 boat transp
4 house habitation
5 car transp
Run Code Online (Sandbox Code Playgroud)
这是一个简单的桌子例子,goods它实际上很长,每个人people可以有多个goods分配给他,例如汽车、船、糖等,一个人可以拥有多少没有限制,并且完全随机。我找不到比昏迷分离更好的存储方法,例如1,5,3
我在进行选择时遇到问题,我需要例如
SELECT people.*, goods.name
FROM people
LEFT JOIN goods ON goods.g_id = people.goods_owned
WHERE name = "Sam"
Run Code Online (Sandbox Code Playgroud)
然而问题是goods_owned在单元格中有多个商品ID,需要以某种方式分解它们才能得到答案:
1, Sam, sugar, car, salt
Run Code Online (Sandbox Code Playgroud)
如果您知道在一个单元格中存储(例如 100)多个昏迷值的更好替代方法,请告诉我。
一个人可以与零个、一个或多个商品相关。一件商品可以与零个、一个或多个人相关。
这是一个多对多的关系。
通常,我们通过创建第三个表来处理此问题,该表是指向其他两个表的“关系”
table: goods_owned
people_id goods_id
1 1
1 4
1 3
2 2
2 5
3 1
3 5
3 2
4 5
4 3
4 4
Run Code Online (Sandbox Code Playgroud)
这两列的组合可以指定为唯一的,并且可以作为表的主键。每列都可以定义为父表的外键。
CREATE TABLE goods_owned
( people_id INT UNSIGNED NOT NULL
, goods_id INT UNSIGNED NOT NULL
, PRIMARY KEY (people_id, goods_id)
-- , KEY FK_goods_owned_people (people_id) -- redundant with PK
, KEY FK_goods_owned_goods (goods_id)
, CONSTRAINT FK_goods_owned_people FOREIGN KEY (people_id) REFERENCES people (id)
, CONSTRAINT FK_goods_owned_goods FOREIGN KEY (goods_id) REFERENCES goods (g_id)
) ;
Run Code Online (Sandbox Code Playgroud)
另一种选择是,如果“商品”集合是静态且定义明确的,并且不需要在表中表示,那么您可以使用 MySQL SET 数据类型,并拥有一个表。但这种方法仅适用于静态集合(不需要更改)。