繁体   English   中英

在 MySQL 字段中存储 csv – 坏主意?

[英]Storing csv in MySQL field – bad idea?

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

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

因此,任何给定的用户都会有一个字段“items”,其值可能类似于“32,3,98,56”。

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

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

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

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

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

考虑到你有,

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);

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

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

如果您知道您只需要存储和检索这些值而不对其进行任何操作,例如连接、搜索、不同、转换为单独的行等 - 可能只是可能,您可以(我仍然会't)。

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

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

这是否是一个坏主意取决于您的业务需求。 我无法从互联网上评估您的业务需求。 在这种情况下,请与您的产品经理交谈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM