用于存储分隔列表的数据类型

时间:2010-07-29 16:05:20

标签: mysql

我想存储像这样的字符串

  

“1,5,6,7,9,45,20,45,78,81 ...”

  • 数字不能是负数或小数,而是从0 - + - 200
  • 变化
  • 数字以','
  • 分隔
  • 列表最长可以是0-150项

我应该将哪种数据类型用于包含这些字符串的列?

2 个答案:

答案 0 :(得分:6)

您要存储的内容称为非规范化数据。 MySQL有一些专门用于处理此问题的功能,但最好的方法是每行存储一个值,如:

id  |  value
---------------
1   |  1
1   |  5
1   |  6
1   |  7

..等等。因为以逗号分隔的列表:

  1. 很难在其中查找特定值
  2. 可以使用MySQL's GROUP_CONCAT function

    生成
      SELECT t.id, 
             GROUP_CONCAT(t.value)
        FROM TABLE
    GROUP BY t.id
    
  3. 这是我推荐的表设置的CREATE TABLE语句:

    DROP TABLE IF EXISTS `example`.`list_values`;
    CREATE TABLE  `example`.`list_values` (
      `id` int(10) unsigned NOT NULL default '0',
      `val` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id`,`val`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    两个列的主键确保您不能为一个集合重复 - 如果对于您要存储的数据不适用,请将其删除。

    列表最长可以是0-150项

    您需要使用a trigger来强制执行该业务规则。

答案 1 :(得分:0)

OMG Ponies的回应是“传统的”面向SQL的响应,但并没有真正解决这个问题。 Postgres具有列的内置列表类型。如果你按照我的方式完成并且或多或少地放弃了完全用SQL构建应用程序,那么在Python中,你可以将你的列表挑选成一个字符串,将它存储在MySQL的varchar列中,然后在它上面进行unpickle在使用它之前撤退。使用pickle可以确保列表中的引用字符串和其他特性得到正确处理。