我正在建立一个网站,我对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/

10-15 20:45