mysql 在多列中存储多个ID的最佳方法

qfe3c7zg  于 2023-01-12  发布在  Mysql
关注(0)|答案(2)|浏览(575)

我在一个正在开发的产品站点中有一个blog表,用户可以发布这些blog,并根据位置、角色和预先设置的用户分组来过滤目标受众的浏览量,所有这些列都将保存来自其他表的多个引用ID。
我发现了很多关于将多个id以单独的1:* 链接表的形式放在一列中的帖子。但出于我的需要,我有6个以上的列发生了这种情况。我理解逻辑上的解决方案是遵循上面的一个,为每一列制作类似的链接表,但这是最好的做法吗?这将如何影响查询的性能或速度,为这一行数据调用所有必要的数据?任何见解都非常感谢,如果有,事实上,我错过了类似的帖子,我道歉。
编辑:

"tile": "news",
"release_date": "--",
"scheduled_release_date": "2023-11-23",
"target_audience": "Only Staff",
"role_ids": "2",
"sub_role_ids": "4,5,7",
"region_ids": "16,2",
"district_ids": "6,207,55,94",
"campus_ids": "15,62,2699,483",
"plan_ids": "28,84,3",
"group_ids": "94,32",
"creator_ids": "Erika"

可能在表中找到的内容的示例行。

ycl3bljg

ycl3bljg1#

在规范化数据库中,多值属性应作为行存储在子表中。
这个表中有多个多值属性的事实并不会改变这个设计原则,每个多值属性都有自己的子表。
不幸的是,如果您需要从多个子表中获取所有值,这会产生一个问题,因为它们往往会相乘。例如,如果您有四个district_ids和四个campus_ids,并且您连接到这两个表,结果中有16行,两个子表之间有一个笛卡尔积。如果您连接到更多的子表,而每个子表都有多个匹配行,情况会变得更糟。
一个解决方案是尽可能避免在单个查询中连接多个子表。执行多个查询可能更好,每个子表一个查询,只是为了避免笛卡尔乘积。
另一个解决方案是使用GROUP BY作为父表的主键,然后使用GROUP_CONCAT()重新组合列表,这感觉就像回到使用逗号分隔列表,但只用于查询结果,而不是存储,您仍然可以获得规范化的好处-避免冗余和数据异常。
另一个解决方案是找到一种方法来关联子表中的值,这样它们就不会被合并成笛卡尔积,如果没有其他自然的方法来关联它们,可以通过窗口函数(如秩或行号)来实现。
有些人试图通过为所有多值属性创建一个子表来解决这个问题,这违反了第四范式,请参阅我对https://stackoverflow.com/a/7084586/20860的回答,以了解该解决方案中可能出现的错误。

vs3odd8k

vs3odd8k2#

为每列创建链接表,但这是最好的做法吗?
简短回答:通常最好有'链接表'。
权衡:
对于一个共产主义者(就像你一样)来说,为一个特定的值寻找这样的东西是混乱和缓慢的。如果你必须的话,请参见FIND_IN_SET()
如果这是一个MySQL不会查看的“opaque”字符串(对于WHERE等),那么很好。可以将其视为JPG。您永远不需要基于图像中的某些像素选择一行。请参阅GROUP_CONCAT()以从多行构造commalist。

相关问题