2016-11-06 49 views
0

我創建聊天應用程序和其聊天看到SQL看起來像下面使用NULL值的唯一鍵工作?

chat_seen --table name 
--Columns--- 
from_user | to_id | group_id | unseen_count 

它的工作原理是這樣的:當GROUP_ID是NULL則表示,這是一對一的聊天,如果GROUP_ID不爲空FROM_USER是最終用戶其中寫的消息和to_id是用戶誰是組成員。我有group_id上的外鍵,它引用組表,並且我有唯一鍵爲3列(from_user,to_id,group_id),當group_id爲null時,它應該工作,因爲from_user並且to_id在一對一聊天中應該是唯一的,但在羣組聊天中,它應該是每個group_id唯一的,如果Unique鍵與NULL VALUES一起工作,這將工作,因爲如果它工作,它會將group_id NULL值計數爲group_id和每個NULL組from_user和to_id將是唯一的。我不能改變group_身份證到任何事物,因爲它有外鍵。

我也想實現,如果group_id不爲null to_id應該有外鍵,它應該引用組成員,group_id不是NULL它應該引用user_id在用戶表中。

更新版本與實例

當有人在每個消息我插入或更新(如果存在),以chat_seen表爲每個用戶組寫消息時,它意味着,如果組包含每每個消息20人我將更新或插入20列以稍後通知他們,如果他們沒有看到聊天。並且我更新每個用戶的unseen_count。

我該怎麼辦?有什麼建議嗎?

+0

這是行不通的(原因很好)。從技術上講,你可以添加一個新的列'group_memberid',並留下'to_id''null'爲組聊天,然後創建一個唯一的密鑰(組聊天和1-1聊天)。另一方面,在你的設計中你可能會遇到一些問題(雖然我不知道你的數據庫,所以這只是一個猜測):a)組成員關係可以改變,所以組表的外鍵可能不起作用例如,如果你離開並重新加入,你錯過了一些消息)和b)在羣聊中,'from'通常與'seen'無關,所以'group_id'可以代替'from'。 – Solarflare

+0

而且還有一般性評論:從您的文字描述中去追蹤您的設計和您的要求是有點困難的。如果添加一些示例數據(並且您的其他表,特別是組成員表會更好),將會更容易遵循。因爲我沒有提到它:sql標準定義了它們在mysql中工作的唯一鍵的行爲:如果你在鍵列中有一個'null',它們並不是唯一的。 – Solarflare

+1

爲NULL指定一些重要性,超出缺失值,因此未知值,通常充滿了陷阱。這是其中之一。你試圖讓NULL意味着不同於SQL的意思。 –

回答

0

我已經用一點點黑客解決了這個問題。當一對一聊天插入chat_seen表時,我首先檢查from_user是否爲null,因爲我允許from_user可以爲null(稍後我會解釋它)。然後,我有創建from_user和to_id唯一鍵。現在我有2個唯一鍵1)from_user和to_id,另一個是2)to_id和group_id(我已從此唯一鍵刪除from_user)。當用戶插入chat_seen表與group_chat mod時,我插入null to_user,因爲我想忽略1)Uniuqe組的密鑰,如果組爲null,則表示一對一聊天2)唯一密鑰將被忽略。

1

爲來自同一個自動序列發生器的用戶分配組的Id字段和Id字段。這保證了給定的Id可以是用戶或組,但不能同時爲兩個。

現在消除到表中的Group_Id。相反,只需將groupId存儲在To_Id字段中以獲取組消息,並使From_Id和To_Id具有唯一性。

如果您只想查看發送到組的消息,只需加入組表。個人的消息將退出加入。

同樣,如果您只想查看給個人的消息,只需加入users表。組的消息將退出加入。

+0

感謝您的回答,我認爲這句話可以解決我的問題「爲來自同一自動序列發生器的用戶分配組的Id字段和用戶的Id字段。 ,但有點不清楚,你能否提供一些有關它的細節?這是什麼意思「相同的自動序列發生器」。我應該給外鑰匙,但我不能給2列外鍵 – Bucky

+0

我知道如何做到這一點在一些數據庫系統,但不是MySQL。我將把它留給mysql用戶來幫助你。 –

+0

真正的交易是用戶和組都是收件人,但他們在不同的表中。通過使用相同的自動序列,我完全避開了完整的建模答案。它是定義一個收件人表,然後使用共享主鍵來複制recipientId作爲用戶標識或組標識。這對你的情況有點矯枉過正。 –