MySQL中存储分隔值的最佳方式

时间:2013-04-22 09:07:41

标签: mysql sql

我有一个数组,用于存储已定义批次的任意项目集。每个项目都在一个单独的表中定义,该表具有自己的属性和值。例如,例如,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...

3 个答案:

答案 0 :(得分:2)

在列中存储逗号分隔值是一种糟糕的设计。正确规范化数据库。如果ItemsBatches的关系为One-to-many,请将表格转换为2表设计。

实施例,

<强>项

  • ItemID(PK)
  • 描述
  • 串行

<强>批次

  • BatchID
  • ItemID(FK)

但如果你有Many-to-many的关系,请考虑添加两者之间的新表。

产品

  • ItemID(PK)
  • 描述
  • 串行

批次

  • BatchID(PK)
  • otherColumns ...

Batch_Item

  • BatchID(FK) - 具有ItemID
  • 的唯一对
  • ItemID(FK)

答案 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 KEYid合并item,如:

id| item
--------
1 | 1
1 | 3
1 | 11
...
2 | 15

我不确定这是否会提高整体性能。无论哪种方式,你都要循环一个数组,你切断了将分隔列表转换为数组的步骤,但是你向SELECT语句添加了更多数据库行和更多结果。