2017-02-06 54 views
0

我有一個應用程序,發佈內容和內容正在審查中。我將它們保持在分開的表格中。MySQL數據庫設計。新索引編號

內容都可以投票和評論,當審查內容發佈我把它插入到已發佈的表,但投票和評論都不會被保存,因爲這一切都在不同的表分開。

表:出版,published_votes,published_comments,審查,reviewing_votes,reviewing_comments

我想保持投票和評論,問題是,在新的崗位必須有一個新的自動增量ID,因爲我展示按ID排序的內容,否則,如果我通過生成文件夾的時間戳命令發佈,並且它不是一個選項。

所以我將加入所有表和只有3個,而當內容發佈我可以做一個新的插入表或更新我認爲這是糟糕的ID。但問題是我必須更新所有投票和評論到新的發佈的id,在某些情況下可能會有數千票,更新將不得不在此刻進行,我想我可以做它異步並延遲發佈。但我不認爲它是一個很好的解決方案。

有什麼想法?

PD:理想情況下,我希望將新發布放在表或索引的末尾而不更改id,並且當我選擇發佈時,通過其物理位置對錶或底部索引進行排序不管數值指標值如何,但顯然這是不可能的,據我所知。

+0

您認爲更新數千張選票需要花費大量時間嗎?通常情況下不會。此外,由於您需要複製表之間的所有數據,因此無需更新,只需複製即可。如果你沒有單獨的表格,只有一個標誌,這不會發生。 –

回答

0

將未發佈內容保留在單獨表格中的原因是什麼?

你可以在同一個表以及相應的票,在子表中的註釋的所有內容。根據「類型」或「狀態」(發佈/審覈)列區分內容。

Content(Id, Title, Text, Status, ...) 
Votes(Id, ContentId, ...) 
Comments(Id, ContentId, ...) 

當內容被新插入它的狀態爲「審閱」。然後,可以通過將「狀態」更改爲「已發佈」來發布內容。此外,當內容狀態更改爲「發佈」時,您可以保留一個時間戳以保存。

這將需要在系統設計水平的變化,但越早越好。

+0

我同意這是最好的主意...此外,我會嘗試添加DateCreated列而不是在ID上進行排序,這聽起來像它可能會咬你(也就是說,如果你必須做一個遷移或重新插入一些舊帖子丟失/損壞) – Milney

+0

已經有一個時間戳,內容已經在過去的同一張表上,區分同一個表中的兩個內容不成問題。我解釋的問題是,我想要一個新的ID,因爲按時間戳順序更沒有效率。由於它不是唯一的,也不是自動增量,所以它必須對所有匹配的內容進行排序,也許我錯了,並且索引將總是有序的,並且在執行SELECT時,它將與通過主鍵唯一自動增量鍵排序一樣高效。 – Vixxs

+0

非聚集索引不如主索引快,這是真的。但是在同一張表上存儲數據會爲複製相關數據和事務管理節省很多麻煩。表的設計不應該依賴於如何排序數據。這是一個可以隨時更改的要求。表格應構建用於數據完整性和連接性能。應該爲查詢性能創建索引。如果你覺得'時間戳'不夠你的情況,你可以隨時在order by子句中添加其他列(如id)。 – madcap