我正在嘗試構建存儲多個用戶消息的數據庫。每個用戶將能夠發送/接收5種不同的消息「類型」(嚴格來說,標籤,實際數據類型將是相同的)。我最初的想法是爲每個用戶創建多個表,代表5種不同的消息類型。我很快就知道這不是一個好主意。我的下一個想法是爲每個消息類型創建一個包含用戶列的表,但我不確定這是從性能角度來看最好的方法。如果用戶1發送100個消息類型1,而用戶3只發送10,會發生什麼?其餘的字段將是空值,我真的不確定這是否有所作爲。思考?建議和/或建議閱讀?先謝謝你!數據庫設計:每個用戶多個表
回答
不,(在這個問題上的主題給出的主意)將極大地低效。每次創建新用戶時都需要引入一個新表,並且一次查詢所有這些表將成爲一場噩夢。
用單個表來存儲關於消息的信息要容易得多。該表中的每一行都將對應於一個且僅有的消息。
此外,此表應該可能有三個'引用'列:兩個用於將特定消息鏈接到其發送者和接收者,另一個用於存儲其類型,只能分配有限的一組值。
例如:
MSG_ID | SENDER_ID | RECEIVER_ID | MSG_TYPE | MSG_TEXT
------------------------------------------------------
1 | 1 | 2 | 1 | .......
2 | 2 | 1 | 1 | #######
3 | 1 | 3 | 2 | $$$$$$$
4 | 3 | 1 | 2 | %%%%%%%
...
這將是很容易得到雙方的所有消息由有人送(與WHERE sender_id = %someone_id%
條款),發送到有人(WHERE receiver_id = %someone_id%
),某些特定類型的(WHERE msg_type = %some_type%
)。但最好的是,可以輕鬆地將這些子句組合起來,以設置更復雜的過濾器。
您最初以爲,似乎什麼,看起來是這樣的:
IS_MSG_TYPE1 | IS_MSG_TYPE2 | IS_MSG_TYPE3 | IS_MSG_TYPE4
---------------------------------------------------------
1 | 0 | 0 | 0
0 | 1 | 0 | 0
0 | 0 | 1 | 0
它可以是NULL
!而非0
,其核心仍然是相同的。它壞了。是的,您仍然可以通過WHERE is_msg_type_1 = 1
條款獲得單一類型的所有消息。但即使是獲得某種特定信息這樣簡單的任務也變得不那麼容易:您必須檢查這5個列中的每個,直到找到具有truthy
值的那個爲止。
類似的困難,指望誰試圖計算每個類型的消息的數量的一個(這幾乎是瑣碎的結構上面給出:。COUNT(msg_id)... GROUP BY msg_type
所以,請不要這樣做),除非你有一個非常有力的理由,不要試圖構建你的桌子,以便隨着時間的推移,他們的身高會增加 - 而不是寬度。
完美。我現在不僅瞭解了什麼,而且還了解了爲什麼。謝謝! – user2442072
其餘字段將是空值
,除非你是垂直設計數據庫,將不會有剩餘的字段。
user int
msgid int
msg text
create table `tv_ge_main`.`Users`(
`USER_ID` bigint NOT NULL AUTO_INCREMENT ,
`USER_NAME` varchar(128),
PRIMARY KEY (`ID`)
)
create table `tv_ge_main`.`Message_Types`(
`MESSAGE_TYPE_ID` bigint NOT NULL AUTO_INCREMENT ,
`MESSAGE_TYPE` varchar(128),
PRIMARY KEY (`ID`)
)
create table `tv_ge_main`.`Messages`(
`MESSAGE_ID` bigint NOT NULL AUTO_INCREMENT ,
`USER_ID` bigint ,
`MESSAGE_TYPE_ID` bigint ,
`MESSAGE_TEXT` varchar(255) ,
PRIMARY KEY (`ID`)
)
- 1. 多個用戶數據庫設計
- 2. 數據庫設計麻煩。每個用戶的表格
- 3. MySQL數據庫設計:一個用戶表,兩個用戶組?
- 4. 如何爲多個用戶設計數據庫表(MySQL)?
- 5. Postgresql - 每個用戶一個數據庫或每個用戶一個數據庫
- 6. 數據庫設計:如何查詢多個表到多個表
- 7. 設計每個商店多個價格的數據庫結構
- 8. CMS數據庫設計 - 每個站點的主數據庫或多個Db
- 9. 多表數據庫設計
- 10. 多用戶數據庫設計
- 11. 數據庫設計:多用戶類型
- 12. 數據庫設計 - 一個表或多個表/連接
- 13. 數據庫設計:多個表對一個表
- 14. 數據庫設計 - 一個鏈接表或多個鏈接表?
- 15. 數據庫設計 - 一個數據庫,多個網站
- 16. 每個用戶一個數據庫
- 17. 面向多個用戶的CRM數據庫設計
- 18. 針對多個用戶屬性的數據庫設計
- 19. 相當大(400k)mysql數據庫設計爲多個用戶
- 20. 針對多個用戶站點的數據庫設計
- 21. Symfony2多個數據庫,爲每個表指定數據庫
- 22. 每個數據庫實例有一個或多個用戶?
- 23. 單一數據庫與多個數據庫的應用設計
- 24. 數百個表的數據庫設計
- 25. 多個模型的數據庫設計?
- 26. 使用這個數據設計一個數據庫表
- 27. 數據庫設計 - 何時將數據分成多個表?
- 28. 每個數據庫一個用戶vs所有數據庫的單個用戶
- 29. 數據庫設計用戶表拆分或單個
- 30. 多用表的數據庫設計
http://pragprog.com/book/bksqla/sql-antipatterns – dm03514