我有两个表,一个用户表和一个items表。在用户表中,有字段" items"。 "项目"表只包含唯一的id和item_name。
现在每个用户可以拥有多个项目。我想避免创建第三个表来将项目与用户连接,而是在user_table中有一个字段,用于存储在" csv"中连接到用户的项目ID。字段。
因此,任何给定的用户都会有一个字段" items"可能有像" 32,3,98,56"。
这样的值值得一提的是,每位用户的最大项目数量相当有限(<5)。
问题:与包含用户&gt;项目对的第三个表相比,这种方法通常是一个坏主意吗?
当您想要查找用户的所有项目时,不会产生相当大的开销(我将不得不遍历MySQL单独返回的所有元素)。
答案 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文件规范化为正确设计的表格。这取决于很多事情。在这种情况下,请与您的企业数据架构师联系。
这是一个坏主意取决于您的业务需求。我无法通过互联网评估您的业务需求。在这种情况下,请咨询您的产品经理。