假設我有三張桌子。我打算讓這些表格儘可能簡單,以說明設計問題:設計與表A,表B或表A和B相關的SQL表的最佳做法是什麼?
用戶:
CREATE TABLE users (user_id INT PRIMARY KEY);
網絡:
CREATE TABLE networks (network_id INT PRIMARY KEY);
網絡用戶:
CREATE TABLE network_users (
network_id INT,
user_id INT,
PRIMARY KEY(network_id, user_id),
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
如上所示,用戶與「網絡用戶」表中描述的網絡具有多對多關係。迄今爲止,這是非常傳統的。
現在,這裏是我的問題:
比方說,我想補充一個信息表,我希望能夠存儲信息發送到:
- 一個特定的用戶,
- 特定網絡,
- 或網絡
什麼是對messag的最佳設計方案中的用戶es表?
我可以構建一個消息表是這樣的:
CREATE TABLE messages (
message_id INT PRIMARY KEY,
network_id INT,
user_id INT,
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
其中:發送到特定的用戶
- 消息具有用於NETWORK_ID字段中發送
- 消息USER_ID字段集和空到特定網絡的network_id字段設置爲NULL並且發送給網絡內的用戶的消息具有network_id和us兩者er_id字段集
但這是最好的方法嗎?由於network_id和user_id字段可能爲空,所以我必須創建一個單獨的主鍵(message_id),而不是使用複合主鍵(network_id和user_id),否則將會這樣做。
如果網絡N中的用戶A與網絡O中的用戶A不同(將消息發送給特定網絡中的特定用戶),則用戶和網絡並不處於多對多關係,太多。 – Shadow
嗯,你能解釋一下嗎?用戶可以在多個網絡中,並且網絡可以包含多個用戶。這不是網絡和用戶之間的多對多關係嗎?消息與網絡中的用戶的消息關係#3將是一對多關係,但這是消息與network_users之間的一對多關係;我認爲消息到網絡用戶的關係不會影響用戶到網絡的關係。 – VKK
如果同一個用戶可以在多個網絡中,那麼向特定網絡中的特定用戶發送消息毫無意義。我只需要將消息發送給用戶。 – Shadow