【发布时间】:2016-10-25 00:20:20
【问题描述】:
让我们从上下文开始。我正在为自己编写一个小应用程序,可用于在 MySQL 数据库中更改和创建产品。
每个产品至少有一种生产方法,例如“锻造”、“焊接”或“机加工”(我的应用程序中存在更多方法)。产品的制造方法可以是这些方法的任意组合。
应用程序当前有一个下拉菜单,其中包含一个复选框列表,可从中选择生产方法,生产方法由文本字段显示。当我的应用程序显示生产方法时,我希望这些按字母顺序排列(不是按点击顺序排列,就像你第一次点击焊接一样,那将是第一个值):
产品桌子:'锻造-焊接-机加工'产品椅子:'焊接-锻造-机加工'
产品椅子:“锻造-焊接-机加工”
当我的应用程序检索产品表时,我还想将“锻造”、“焊接”和“机加工”方法设置为 true。
我是否应该使用 MySQL 产品表中的一个字段来保存方法组合的字符串(如上),并让我的应用程序在单击复选框时处理排序并将此字符串保存到产品中的这一字段表,
或者,
我应该在我的数据库中使用多对多关系,其中存在所有生产方法的表,并且我使用连接表将产品 (pID = 2) 与锻造 (mID = 1)、焊接 (= 2) 和机加工 (= 3) 喜欢
pID - mID
2 - 1
2 - 2
2 - 3,
或者,
我应该使用像
这样的表吗
pID - 方法
2 - 锻造
2 - 焊接
2 - 机加工
在性能方面(大量产品和大量方法)最明智的做法是什么?每次应用程序加载不同的产品(这种情况经常发生)时执行一堆查询,或者从产品表中执行一个查询并以这种方式加载方法(拆分字符串并将每个方法与 for 循环中的复选框进行比较)?
【问题讨论】:
-
将多个数据点打包到一个字段中几乎不是一个好主意;重复存储相同的字符串,以后可能需要通过它们进行搜索(您的最后一个想法)也是次优的。最好的解决方案通常是“方法表和pId-mId M:N 表”。如果您知道方法的数量会受到限制(听起来并非如此),您还可以在产品上为每种方法使用单独的“标志”字段(但我倾向于远离该策略,即使列表预计会受到限制,因为需求会随着时间而变化)。
标签: java mysql performance many-to-many