比如说一个人有几种性格标签
我自己想了两种方法:
第一种:
设计两张表
user表:
a_id | name |
---|---|
1 | 小明 |
2 | 小李 |
3 | 小张 |
tag表:
id | user_id | tag |
---|---|---|
1 | 1 | 活泼 |
2 | 1 | 可爱 |
2 | 2 | 活泼 |
2 | 3 | 可爱 |
分页sql:
select u.id,u.name,t.tag from (select id,name from `user` limit #{crrent},#{size}) u LEFT JOIN tag t on u.id=t.user_id;
结果:
1 小明 活泼
1 小明 可爱
然后用stream流在代码里对u.name 进行分组,将t.tag作为子集合返回。如果查询t.tag=活泼作为查询条件,则少了小明的另一个tag=可爱,结果:
1 小明 活泼
2 小李 活泼
达不到预期效果,感觉要是数据量过多,这样做性能也会出问题的吧
第二种:
设计一张表
a_id | name | tag |
---|---|---|
1 | 小明 | 活泼,可爱 |
2 | 小李 | 活泼 |
3 | 小张 | 可爱 |
sql:select * from
user where tag like '%活泼%' limit #{crrent},#{size}
能达到预期效果,但是违反了第一范式,数据量大可能性能也会有问题,然后tag去like
查询结果也不太准确
有没有更好的设计思路?
这样?