我有一个数组,用于存储已定义批次的任意项目集。每个项目都在一个单独的表中定义,该表具有自己的属性和值。例如,例如,ID为1的批次包含项目1,3,11,16,17,批次2包含项目5,11,15。在MySQL中存储像这样的数组的正确方法是什么?目前,我将项目作为逗号分隔的字符串存储在items列中。每当我需要检索信息时,我查询该列,将字符串拆分为数组,循环遍历该数组,从拆分值创建新查询,然后运行新查询以加入拆分值。当然必须有更好的方法吗?
表格布局示例:
Batches table:
==============
id|items
--------
1 |1,3,11,16,17
2 |5,11,15
Items table:
============
id|description |serial
--------------------------
1 |some description|00046552
2 |etc |00046653
3...
答案 0 :(得分:2)
在列中存储逗号分隔值是一种糟糕的设计。正确规范化数据库。如果Items
与Batches
的关系为One-to-many
,请将表格转换为2表设计。
实施例,
<强>项
<强>批次强>
但如果你有Many-to-many
的关系,请考虑添加两者之间的新表。
产品
批次
Batch_Item
答案 1 :(得分:2)
我会将数据存储为多对多关系:
Batches table:
==============
id | Batch description
---+------------------
1 | Some description
2 | Some other desc...
Items table:
============
id|description |serial
--+----------------+------
1 |some description|00046552
2 |etc |00046653
3...
Batch items:
============
batch_id | item_id
---------+--------
1 | 1
1 | 3
1 | 11
1 | 16
1 | 17
2 | 5
2 | 11
2 | 15
如果批次中的项目顺序很重要,您可以向Batch items
表添加另一列以指示批次中的订单;或者只是使用item id作为排序列。
通过这种方式,您可以使用外键强制执行参照完整性,并且可以更轻松地操作批处理中的各个项目。
答案 2 :(得分:1)
“SQL正确”方法是每id
个多行,并使用PRIMARY KEY
和id
合并item
,如:
id| item
--------
1 | 1
1 | 3
1 | 11
...
2 | 15
我不确定这是否会提高整体性能。无论哪种方式,你都要循环一个数组,你切断了将分隔列表转换为数组的步骤,但是你向SELECT
语句添加了更多数据库行和更多结果。