2017-05-22 58 views
0

假設我有三張桌子。我打算讓這些表格儘可能簡單,以說明設計問題:設計與表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) 
); 

如上所示,用戶與「網絡用戶」表中描述的網絡具有多對多關係。迄今爲止,這是非常傳統的。

現在,這裏是我的問題:

比方說,我想補充一個信息表,我希望能夠存儲信息發送到:

  1. 一個特定的用戶,
  2. 特定網絡,
  3. 或網絡

什麼是對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) 
); 

其中:發送到特定的用戶

  1. 消息具有用於NETWORK_ID字段中發送
  2. 消息USER_ID字段集和空到特定網絡的network_id字段設置爲NULL並且發送給網絡內的用戶的消息具有network_id和us兩者er_id字段集

但這是最好的方法嗎?由於network_id和user_id字段可能爲空,所以我必須創建一個單獨的主鍵(message_id),而不是使用複合主鍵(network_id和user_id),否則將會這樣做。

+0

如果網絡N中的用戶A與網絡O中的用戶A不同(將消息發送給特定網絡中的特定用戶),則用戶和網絡並不處於多對多關係,太多。 – Shadow

+0

嗯,你能解釋一下嗎?用戶可以在多個網絡中,並且網絡可以包含多個用戶。這不是網絡和用戶之間的多對多關係嗎?消息與網絡中的用戶的消息關係#3將是一對多關係,但這是消息與network_users之間的一對多關係;我認爲消息到網絡用戶的關係不會影響用戶到網絡的關係。 – VKK

+0

如果同一個用戶可以在多個網絡中,那麼向特定網絡中的特定用戶發送消息毫無意義。我只需要將消息發送給用戶。 – Shadow

回答

1

你在你的問題中描述的是一種多態關聯。看看this article,它描述了一些可能的方法來模擬這些。儘管本文描述如何以最一般的方式建立多態關聯模型,但我認爲你的方法也不錯,因爲很可能不會有超過3種消息類型(對於用戶,對於網絡和在網絡中的用戶)我見過

+0

這是我的問題的完美文章。謝謝! – VKK

+0

很酷,我很高興你發現它有幫助 –

1

一種方法是在messagesentity_identity_type其中類型告訴你的記錄是否指usernetwork(或一些其他類型後)沿。 This response有一些有趣的例子來處理這種情況。

+0

在這種方法中有一種方法來定義一個外鍵約束? – VKK

+0

不支持MySQL,因爲外鍵引用過於僵化,無法支持多個表。 – Carl

0

如果你有很多:

CREATE TABLE ABC (
    a_id ..., 
    b_id ..., 
    c_id ..., 
    PRIMARY KEY(a_id, b_id, c_id), 
    INDEX(b_id, c_id, a_id), 
    INDEX(c_id, a_id, b_id) 
) ENGINE=InnoDB; 

的指標讓你從朝其他表的任何表中獲取:中三件事情(A,B,C)一對多的關係。

但是...讓我們看看你的一些SELECTs,然後確定這是最好的。

+0

糾正我,如果我錯了,但不是主鍵的所有列必須不爲空?如果是這樣的話,我會如何處理我的問題中的關係#1和#2? – VKK

+0

糟糕。計劃A:使用特定(非空)值而不是NULL。計劃B:我的答案不起作用。 –

相關問題