2016-10-25 88 views
0

让我们从上下文开始。我正在为自己编写一个小应用程序,它可以用来在MySQL数据库中修改和创建产品。每个产品至少有一种生产方法,例如“锻造”,“焊接”或“机加工”(我的应用中存在更多的方法)。产品的生产方法可以是这些方法的任意组合。MySQL - 一个字段或多对多关系中的多个值?

该应用程序目前有一个下拉菜单,其中包含复选框列表以选择生产方法,生产方法由文本框显示。当我的应用程序显示的生产方法,我想这将字母顺序(没有被点击的顺序排序,就像如果你第一次点击焊接,这将是第一个值):

产品:“锻造 - 焊接 - 加工”
产品 椅子: '焊接 - 锻造 - 加工'
产品椅子: '锻造 - 焊接 - 加工'

当我的应用程序检索产品TABL e我也想将'伪造','焊接'和'加工'方法设置为true。

我应该在MySQL产品表中使用一个字段来保存方法组合的字符串(如上所述),并让我的应用程序在单击复选框时处理排序并将此字符串保存到产品表,

我应该在我的数据库中使用多对多关系,其中所有生产方法的表存在,并且我使用联结表将产品(pID = 2)与伪造的(mID = 1),焊接(= 2)和加工(= 3)等
- PID MID
2 - 1
2 - 2
2 - 3,
或,
我应该使用像
pID的一个表 - 方法
2 - 锻造
2 - 焊接
2 - 加工

什么是性能代价(大量的产品和许多方法)最聪明的事情呢?每当应用程序加载一个不同的产品(发生很多事情)或产品表中的一个查询并加载这些方法(分割字符串并将每个方法与for循环中的复选框进行比较),执行一堆查询?

+0

将多个数据点打包到单个字段中几乎从来都不是一个好主意;重复存储相同的字符串,并且稍后可能需要通过它们进行搜索(您最后的想法)也不太理想。最好的解决方案通常是_“方法表和pId-mId M:N表”_。如果你知道方法的数量是有限的(听起来好像不是这样),你也可以在每种方法的产品上使用单独的“标志”字段(但是我倾向于远离该策略,即使列表预计会受到限制,因为需求会随着时间而改变)。 – Uueerdo

回答

0

您应该将数据库设计为标准化。它不一定是最快的选择,但它绝对是最容易管理的。最可能的是,无论如何,你都需要生产方法表,所以多对多关系是一个自然的选择。它也使得像生产方式过滤这样的任务变得小菜一碟。你真的不想解析服务器上的字符串来实现这一点。

如果您需要更快的响应,您可以随时将这些连接的字符串预先计算到表中。只是不要将它们用作主要数据。