2014-03-06 70 views
1

我正在建立一个网站,我有一点点的知识的PHP和SQL。 当涉及数据库中的多对多关系时,我遇到了很多问题。后面的逻辑插入到许多数据库和取消

我对每种材料都有特定的产品,例如不可能有相同的产品2的材料

材料皮革,使用simil-皮革,布,PVC

字段是可以使用的该材料的领域:体育,休闲,工作

的问题是,材料,在许多领域中使用和场具有相关联的许多材料,所以它的N:M

产品可以在许多领域中使用和场可用于许多产品,因此太N:M

例如,皮革可用于工作,运动,工作中的运动和办公用品

产品可用于部分或全部应用领域,反之亦然。

为了达到这个更好的架构A还是B?

(产品具有总是的材料相同的应用领域,不能属于具有的应用领域的材料不具有的材料的产品)

A)http://i60.tinypic.com/27zdk4k.jpg B)http://i57.tinypic.com/2mhc03o.jpg

如果我理解正确,多对多的关系可以在两者之间的“中间”表中工作。

所以,当它来到我的数据库中插入数据和价值观,我有什么是:

材料

  • 1皮革

  • 2布

MATIERIAL_APPL_FIELD

APPLICATION_FIELD

  • 1 NAUTIC
  • 2休闲

以这种方式,皮革具有2应用领域。但是我怎样才能以一种聪明的方式填补中桌?

也 当我想取消的东西,这是更好的建筑? 我应该从所有表中取消?

回答

-1

如果我正确理解你的问题,下面的解决方案应该可以工作。请记住,它们可能是针对您的问题的多种正确解决方案,并且我没有真正测试此代码,因此可能会出现拼写错误。 ('''''',''''''''),使用枚举('''''''''''',''''''''''''''''') '工作'));插入到应用程序(材料,使用)值('皮革','工作');插入应用(材料,使用)值('皮革','休闲');

+0

我只是想帮忙。也许你可以在下次自动对我的回应进行投票之前澄清你的问题。 –

+0

我没有downvote你其实 – user3384514

+0

行。对这个假设感到抱歉。 –

0

这里的另一个好的解决办法:

创建表的材料(material_id tinyiny无符号不为空的auto_increment主键,材料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主键,材料tinyint无符号,使用tinyint无符号,活动tinyint无符号默认值= 1);}};}};}};插入应用程序(材料,使用)值(?,?);

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

最好不要从表格中删除行。相反,你可能希望灭活它们。试试这个:

update applications set active = 0 where application_id =?;

更新应用程序设置活动= 0其中材料= 1和使用= 2;

更新应用程序设置活动= 0其中材料=(从材料选择材料='皮革')和使用=(选择use_id从use where use ='sport');