[英]Database design: Multiple tables per user
我正在嘗試建立一個數據庫,用於存儲多個用戶的消息。 每個用戶將能夠發送/接收5種不同的消息“類型”(嚴格來說是標簽,實際數據類型將是相同的)。 我最初的想法是為每個用戶創建多個表,分別代表5種不同的消息類型。 我很快就知道這不是一個好主意。 我的下一個想法是為每種消息類型的用戶列創建1個表,但是從性能的角度來看,我不確定這是最好的方法。 如果用戶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
。
所以請不要這樣做。 )除非您有非常強烈的理由不這樣做,否則請嘗試對表進行結構設計,以便隨着時間的流逝它們的高度將增加,而不是寬度增加。
其余字段將為空值
除非您是垂直設計數據庫,否則將沒有剩余字段。
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`)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.