比如我们有个表(UserLiked)记录用户喜欢的 workspace 内容,且一个用户可以喜欢多个 workspace
前端的 UI 展现是用户点击 like 界面显示出用户全部喜欢的 workspace
现在有下面两种表结构,你觉着哪种不错?
注意,MYSQL并不支持Array类型,这里只是比较表设计。
Mongodb支持Array,文档数据库表结构灵活,不要滥用Array,不要过早优化
A 表
ID | UserID | LikedIds |
---|---|---|
int | int | Array<int> |
又或者 B 表
ID | UserID | workspaceID |
---|---|---|
int | int | int,外健 |
A 表可以保证只存在唯一一个 UserId,这时 UserID 可以作为主键
B 表 UserID 可以存在多个,UserID, workspaceID 共同作为主键
为了拿到更细度的 workspace 数据两个数据表都需要 Join 联查
你真的需要存储数组吗?
https://stackoverflow.com/questions/17371639/how-to-store-arrays-in-mysql
https://stackoverflow.com/a/17371788/7529562
上文 A 表结构要通过数组实现,但 MYSQL 并不支持数组,为什么不支持?
设想我们还有一张记录用户全部的手机号 UserPhones 表。按照 UserLiked 的设计我们会在 User 表中添加 Phones 数组,现在表成了这样
UserID | Phones | Liked |
---|---|---|
int | Array<int> | Array<int> |
那如果今后还有相似的需求呢?难道总是通过加数组解决吗?
最好的解决办法是像 B 表,将两张表分裂成三张表
User 表只存储用户信息, Phone 表只存储手机号码信息,如果两表有关联应使用新的表记录两者的关联,并通过 JOIN 多表联查,这就是关系数据库。