2013-11-03 39 views
0

我正在用C#構建一個.net的web應用程序,它允許用戶打開一些項目,並且在每個項目中他們都有數據在MYSQL中包含地圖和表格以用於地圖上的項目。 (每個人都有相同的表格)。 我想知道如何建立兩個選項之間的SQL結構: 1)每個註冊到該網站的人都會爲他自己獲得一個新的數據庫。 2)每一個人都會得到一個唯一的ID,表中的每一個項目都會有更多的這個ID列,我將只選擇這個ID。數據庫爲每個用戶?或同一個數據庫中的每一個人

什麼會更有效?

+2

創建特定實體的任何實例數據庫似乎不必要的麻煩,當然也屢見不鮮。除非你有沒有提及選擇1的真正原因,否則選項2似乎是明確的選擇。 – David

+0

選項2唯一值得關注的是數據庫大小和性能。但通常可以通過投入更多的硬件和巧妙的索引來克服這一點。但是,這並不能保證。 –

回答

1

正如其他答覆者已經提到的那樣,爲每個用戶創建一個數據庫並不常見。但是,將user_id直接添加到每列也可能不是一個好主意。理想情況下,您應該正確設計不同數據(用戶,地圖,您的案例中的項目)之間的關係,並使用正確的索引/鍵具有靈活高效的模式。

設計示例可以是:

CREATE TABLE user (
int id NOT NULL, 
.... // user data fields will come here... 
PRIMARY KEY(id) 
) ENGINE = InnoDB; 

CREATE TABLE map (
int id NOT NULL, 
.... // map data fields will come here... 
PRIMARY KEY(id) 
) ENGINE = InnoDB; 

CREATE TABLE item (
int id NOT NULL, 
.... // item data fields will come here... 
PRIMARY KEY(id) 
) ENGINE = InnoDB; 

CREATE TABLE map_has_item (
    int map_id NOT NULL, 
    int item_id NOT NULL, 
    PRIMARY KEY (map_id, item_id), 
    FOREIGN KEY (map_id) REFERENCES map (id), 
    FOREIGN KEY (item_id) REFERENCES item (id) 
) ENGINE = InnoDB; 

CREATE TABLE user_has_map (
    int user_id NOT NULL, 
    int map_id NOT NULL, 
    PRIMARY KEY (user_id, map_id), 
    FOREIGN KEY (user_id) REFERENCES user (id), 
    FOREIGN KEY (map_id) REFERENCES map (id) 
) ENGINE = InnoDB; 

上述設計將幫助你編寫應用程序相關的簡單查詢。所有使用上述索引的查詢都會很快。

此外,它對於添加潛在功能將足夠靈活。例如,如果其他用戶可以爲其他用戶的地圖做出貢獻,則可以向user_has_map表中添加權限/角色列,並通過正確設置此列來添加新行。

可以改進上面定義的外鍵以確保數據完整性(在數據庫上具有語義上正確的數據)。您可以設置ON DELETE和ON UPDATE觸發器,以便在從數據庫中刪除地圖或用戶時簡化清理過程。您可以通過以下鏈接瞭解更多的外國鍵:

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

Basics of Foreign Keys in MySQL?

0

一個數據庫。唯一的ID。幾乎每個存儲過程或SQL語句都會有「WHERE UniqueID =」。

相關問題