我正在建立一个网站,我对php和sql有一点了解。
当涉及到数据库中的多对多关系时,我遇到很多问题。
我有适合每种材料的产品,例如2种材料不能有相同的产品
材料是皮革,类似皮革,布料,PVC
使用领域是该材料可以使用的领域:运动,休闲,工作
问题是材料可以用于许多领域,并且一个领域关联了许多材料,所以它是N:M
一个产品可以用于很多领域,一个领域可以用于很多产品,所以它太N:M
例如,皮革可以用于工作,运动,工作场所和办公室的布料
该产品可用于某些或所有应用领域,反之亦然。
要实现这个更好的架构是A还是B?
(产品的材料应用领域总是相同的,不能是属于材料应用领域没有的材料的产品)
A)http://i60.tinypic.com/27zdk4k.jpg
B)http://i57.tinypic.com/2mhc03o.jpg
如果我正确理解的话,那么在这两者之间的“中间”表上有许多关系。
因此,在数据库中插入数据和值时,我拥有的是:
材料
1个皮革
2布
MAtERIAL_APPL_FIELD
1 1
1 2
2 2
APPLICATION_FIELD
1航海
2休闲
这样,皮革有2个应用领域。但是,我如何以一种聪明的方式来填补中间桌呢?
也
当我想取消某些内容时,哪种架构更好?
我应该从所有桌子上取消吗?
最佳答案
这是另一个好的解决方案:
创建表材料(material_id tinyiny unsigned not null auto_increment主键,材料varchar(60));
创建表使用(use_id tinyiny unsigned not null auto_increment主键,使用varchar(60));
创建表应用程序(application_id int unsigned不为null auto_increment主键,材料tinyint unsigned,使用tinyint unsigned,活动的tinyint unsigned默认= 1);
插入到应用程序(材料,用途)中的值(?,?);
问号将代表材料的ID和用途的ID。
最好不要从表中实际删除行。相反,您可能希望停用它们。尝试这个:
更新设置为active = 0的应用程序,其中application_id =?;
更新应用程序设置为活动= 0,其中材料= 1,使用= 2;
更新应用程序,设置为active = 0,其中material =(从material =“皮革”的材料中选择material_id)和use =(从use =“ sport”的用途中选择use_id);
关于php - 插入多对多数据库和取消操作背后的逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22232338/