逻辑背后插入多对多数据库并取消

时间:2014-03-06 17:58:35

标签: php mysql sql database

我正在建立一个网站,我对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 nautic
  • 2休闲

通过这种方式,皮革有2个应用领域。但我怎么能以聪明的方式填补中间桌呢?

另外 当我想取消某些东西时,这是更好的架构? 我应该从所有表中取消?

2 个答案:

答案 0 :(得分:0)

这是另一个很好的解决方案:

创建表格材料(material_id tinyiny unsigned not null auto_increment primary key,material varchar(60));

create table uses(use_id tinyiny unsigned not null auto_increment primary key,use varchar(60));

创建表应用程序(application_id int unsigned not null auto_increment primary key,material tinyint unsigned,use tinyint unsigned,active tinyint unsigned default = 1);

插入应用程序(材料,使用)值(?,?);

问号将代表材料的ID和使用ID。

最好不要从表中删除行。相反,您可能希望将它们取消激活。试试这个:

更新应用程序设置active = 0,其中application_id =?;

更新应用程序设置active = 0其中material = 1并使用= 2;

更新应用程序设置active = 0其中material =(从material ='leather'的材料中选择material_id)并使用=(选择use_id from uses where use ='sport');

答案 1 :(得分:-1)

如果我理解你的问题,下面的解决方案应该有效。请记住,它们可能是您问题的多个正确解决方案,而且我实际上并未测试此代码,因此可能存在拼写错误。

创建表应用程序(application_id int unsigned not null auto_increment主键,material enum('leather','semi-leather','cloth','PVC'),使用enum('sport','leisure','工作'));

插入应用程序(材料,使用)值('皮革','工作');

插入应用程序(材料,使用)值('皮革','休闲');