簡體   English   中英

數據庫設計:每個用戶多個表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM