可能重复:
在数据库列中存储分隔列表真的那么糟糕吗?
我一直在处理几个 PHP/MySQL 项目,其中所有关系都存储为逗号分隔的字符串。
例如,一个共同的关系就像
(在伪代码中)
table people
id - integer
name - string
age - integer
teams - string (CSV OF integers, ex '1,3,9,21')
table teams
name - String
id - integer
管理关系变得很麻烦。
要为一个人获取所有团队:
$person = 'SELECT * FROM People WHERE id= x';
然后在php中我一直在做类似的事情
$person['teams'] = SELECT * FROM teams WHERE id IN ($person['teams']);
当我写这篇文章时,我意识到我可以将它们组合在一个 mysql 查询中,比如:
SELECT
people.id,
people.name,
people.teams,
teams.name
FROM people
JOIN teams ON FIND_IN_SET(teams.id, people.teams) WHERE people.id=x
使用这种类型的设置,我发现自己FIND_IN_SET
经常使用
最后,我的问题是:创建这样的关系是否有性能优势?
到目前为止,根据我的经验,FIND_IN_SET 通常会进行全表扫描。如果没有性能优势,在哪些情况下使用逗号分隔的整数列表是有益的? 似乎 mysql 设计者在创建 FIND_IN_SET 时有一些想法。