鍍金池/ 問答/HTML5  數(shù)據(jù)庫/ mysql收藏功能開發(fā)

mysql收藏功能開發(fā)

clipboard.png

clipboard.png
我現(xiàn)在有這兩個表 一個用戶 一個存儲文章

現(xiàn)在想開發(fā)收藏文章功能,一個用戶可以收藏多篇文章,但是不用考慮每篇文章都是被誰收藏的,能知道每篇文章的收藏數(shù)量就行。 請問 應(yīng)該如何建表? 本人新手 能給個像我這樣的表格更好 謝謝

網(wǎng)上查了 說不推薦這樣做是嗎 ?在user表里加一個字段 存儲收藏文章的id用,號隔開 這樣做有什么不好嗎(下圖)

clipboard.png

還有一種是建一個收藏表 這樣做對嗎? 應(yīng)該怎么設(shè)置主鍵呢?應(yīng)該怎關(guān)聯(lián)表呢?(本人新手 不懂主鍵和關(guān)聯(lián))
假如在用戶頁面 想查看收藏文章的列表,查詢語句應(yīng)該怎么寫呢?比如想查找用戶2的收藏文章的列表信息
根據(jù)user_id = 2 想得到[{article_id:10,title:"文章1"},{article_id:11,title:"文章2"}]查詢語句應(yīng)該怎么寫呢?

clipboard.png

回答
編輯回答
青裙

1.這個就應(yīng)該冗余了,你目前沒更多需求,但是要考慮到將來可能潛在的需求。
id,user_id,article_id
什么是可能是潛在的需求呢
2.舉個例子,比如說你們做了社交圈子,比較常見的設(shè)計就是找出和你有共同興趣愛好的人,那么你如何去找,是不是得分析數(shù)據(jù),那么共同收藏是不是可以作為一個點(diǎn)。而且SQL只要這么寫SELEC * from shoucang where article_id= {你收藏文章的ID} limit 10,可以走索引,不會造成性能開銷
3.數(shù)據(jù)庫設(shè)計中,涉及到 1:N , N:N 。無論前期需求如何,一定要設(shè)計一張中間表。

2018年9月20日 08:12
編輯回答
筱饞貓

個人覺得用逗號隔開的就不方便后期做一些其他處理了,例如反過來要查詢多少個用戶收藏了同一篇文章

2017年11月7日 22:54
編輯回答
懶豬

你需要了解join操作
至于主鍵,你可以用user_id和article_id一起作為復(fù)合主鍵,最簡單的作法如下(假定你的用戶id和文章id不變。。當(dāng)然一般是不變的)...

create table shoucang_table
(  
   user_id int(11),
   article_id int(11), 
   create_at datetime,
   primary key (user_id ,article_id ) 
) 

這樣要知道用戶2的收藏列表,可以
`select article_table.id,article_table.title,article_table.author from
article_table inner join shoucang_table
on shoucang_table.user_id=2 and shoucang_table.article_id=article_table.id`
join把收藏表和文章表連接起來,on后面是條件。這里指定收藏表中用戶id為2,且收藏表的文章id和文章表id對應(yīng)。

有疑惑歡迎在評論里提出...

其他:

語句可以優(yōu)化下,因?yàn)閖oin操作其實(shí)是兩張表的叉乘,會將m條數(shù)據(jù)的收藏表和n條數(shù)據(jù)的文章表合成一個m*n的大表。因此可以選中收藏表中用戶id為2的作為子表,假設(shè)有k條(k<<m),合成的表就是k*n條記錄。

select article_table.id,article_table.title,article_table.author from article_table
 inner join 
(select * from shoucang_table where user_id=2) as shoucang
 on  shoucang.article_id=article_table.id

當(dāng)然可以建立表的索引來進(jìn)一步優(yōu)化,這些以后再研究先了解mysql的常用操作吧

2017年4月26日 17:45
編輯回答
遲月

如果用數(shù)組存儲的話吶,一個用戶對應(yīng)有一個數(shù)組,里面存放文章的唯一id值,查看的話就查詢這個用戶下的數(shù)組的所有值

2018年2月11日 11:23