0

我有一个数组,它为定义的批次存储任意一组项目。每个项目都在一个单独的表中定义,具有自己的属性和值。

例子

  • 第 1 批包含项目 1、3、11、16、17,
  • 第 2 批包含项目 5、11、15。

在 MySQL 中存储这样的数组的正确方法是什么?

目前,我将项目作为逗号分隔的字符串存储在项目列中。每当我需要检索信息时,我都会查询该列,将字符串拆分为一个数组,遍历该数组,从拆分值创建一个新查询,然后运行一个新查询加入拆分值。当然必须有更好的方法来做到这一点?

表格布局示例:

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...
4

3 回答 3

2

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

例子,

项目

  • 物品 ID (PK)
  • 描述
  • 串行

批次

  • 批号
  • 项目 ID (FK)

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

项目

  • 物品 ID (PK)
  • 描述
  • 串行

批次

  • 批号(PK)
  • 其他列...

Batch_Item

  • BatchID (FK) -- 与 ItemID 的唯一对
  • 项目 ID (FK)
于 2013-04-22T09:13:14.703 回答
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以指示批次中的顺序;或者简单地使用项目 ID 作为排序列。

通过这种方式,您可以使用外键强制执行参照完整性,并使操作批处理中的单个项目变得更加容易。

于 2013-04-22T09:14:37.723 回答
1

'SQL 正确' 方法将是每行有多个行,并使用id以下组合:PRIMARY KEYiditem

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

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

于 2013-04-22T09:13:02.303 回答