我創建聊天應用程序和其聊天看到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。
我該怎麼辦?有什麼建議嗎?
這是行不通的(原因很好)。從技術上講,你可以添加一個新的列'group_memberid',並留下'to_id''null'爲組聊天,然後創建一個唯一的密鑰(組聊天和1-1聊天)。另一方面,在你的設計中你可能會遇到一些問題(雖然我不知道你的數據庫,所以這只是一個猜測):a)組成員關係可以改變,所以組表的外鍵可能不起作用例如,如果你離開並重新加入,你錯過了一些消息)和b)在羣聊中,'from'通常與'seen'無關,所以'group_id'可以代替'from'。 – Solarflare
而且還有一般性評論:從您的文字描述中去追蹤您的設計和您的要求是有點困難的。如果添加一些示例數據(並且您的其他表,特別是組成員表會更好),將會更容易遵循。因爲我沒有提到它:sql標準定義了它們在mysql中工作的唯一鍵的行爲:如果你在鍵列中有一個'null',它們並不是唯一的。 – Solarflare
爲NULL指定一些重要性,超出缺失值,因此未知值,通常充滿了陷阱。這是其中之一。你試圖讓NULL意味着不同於SQL的意思。 –