在MySQL领域存储csv - 坏主意?

时间:2017-02-07 14:25:42

标签: mysql csv

我有两个表,一个用户表和一个items表。在用户表中,有字段" items"。 "项目"表只包含唯一的id和item_name。

现在每个用户可以拥有多个项目。我想避免创建第三个表来将项目与用户连接,而是在user_table中有一个字段,用于存储在" csv"中连接到用户的项目ID。字段。

因此,任何给定的用户都会有一个字段" items"可能有像" 32,3,98,56"。

这样的值

值得一提的是,每位用户的最大项目数量相当有限(<5)。

问题:与包含用户&gt;项目对的第三个表相比,这种方法通常是一个坏主意吗?

当您想要查找用户的所有项目时,不会产生相当大的开销(我将不得不遍历MySQL单独返回的所有元素)。

2 个答案:

答案 0 :(得分:2)

您不希望以逗号分隔的形式存储值。

当您决定将此列与其他表连接时,请考虑这种情况。

考虑一下,

x  items
1  1, 2, 3
1  1, 4
2  1

并且您希望为每个x找到不同的值,即:

x  items
1  1, 2, 3, 4
2  1

或者可能想要检查其中是否有3

或者可能想要将它们转换为单独的行:

x  items
1  1
1  2
1  3
1  1
1  4
2  1

这将是一个巨大的痛苦。

使用至少标准化第一原则 - 每个值都有单独的行。

现在,最初说你有这个表:

x  item
1  1
1  2
1  3
1  1
1  4
2  1

您可以轻松将其转换为csv值:

select x, group_concat(item order by item) items
from t
group by x

如果你想搜索x = 1是否有第3项。轻松。

select * from t where x = 1 and item = 3

在之前的情况下会使用可怕的 find_in_set

select * from t where x = 1 and find_in_set(3, items);

如果您认为可以使用CSV值进行搜索,则首先like %x%无法使用索引。其次,它会产生错误的结果。
假设您要检查项目ab是否存在并且您执行%ab%它将返回带有abc abcd abcde的行....

如果你有很多用户和项目,那么我建议用PK用户ID创建单独的表users,用PK itemid创建另一个items,最后用userid创建一个映射表user_item ,itemid列。

如果你知道你只需要存储和检索这些值而不需要对它进行任何操作,例如加入,搜索,区分,转换为单独的行等等 - 可能只是可能,你可以(我仍然不会。)

答案 1 :(得分:0)

将复杂数据直接存储在关系数据库中是对关系数据库的非标准使用。通常它们是为标准化数据而设计的。

根据可能有用的软件品牌,有不同的扩展名。或者,您可以将CSV文件规范化为正确设计的表格。这取决于很多事情。在这种情况下,请与您的企业数据架构师联系。

这是一个坏主意取决于您的业务需求。我无法通过互联网评估您的业务需求。在这种情况下,请咨询您的产品经理。