2010-08-21 90 views
0

我正在製作一個在線遊戲和我的數據庫中的一個表。最重要的一個也許。它開始變得非常大。我創建一個功能,您可以與多個用戶一起去爲我有一個表,這個樣子至今:MySQL數據庫中的表太大

CREATE TABLE `oc` (
    `id` int(11) NOT NULL auto_increment, 
    `leader` varchar(40) NOT NULL default '', 

    `car` int(11) NOT NULL default '0', 
    `car_type` char(2) NOT NULL default '', 

    `seats` varchar(3) NOT NULL default '0', 
    `share` enum('1','2') NOT NULL default '1', 
    `location` varchar(100) NOT NULL default '', 

    `user1` varchar(40) NOT NULL default '', 
    `user2` varchar(40) NOT NULL default '', 
    `user3` varchar(40) NOT NULL default '', 
    `user4` varchar(40) NOT NULL default '', 
    `user5` varchar(40) NOT NULL default '', 
    `user6` varchar(40) NOT NULL default '', 
    `user7` varchar(40) NOT NULL default '', 
    `user8` varchar(40) NOT NULL default '', 
    `user9` varchar(40) NOT NULL default '', 

    `leader_gun` char(2) NOT NULL default '', 
    `user1_gun` char(2) NOT NULL default '', 
    `user2_gun` char(2) NOT NULL default '', 
    `user3_gun` char(2) NOT NULL default '', 
    `user4_gun` char(2) NOT NULL default '', 
    `user5_gun` char(2) NOT NULL default '', 
    `user6_gun` char(2) NOT NULL default '', 
    `user7_gun` char(2) NOT NULL default '', 
    `user8_gun` char(2) NOT NULL default '', 
    `user9_gun` char(2) NOT NULL default '', 

    `user1_inv` varchar(40) NOT NULL default '', 
    `user2_inv` varchar(40) NOT NULL default '', 
    `user3_inv` varchar(40) NOT NULL default '', 
    `user4_inv` varchar(40) NOT NULL default '', 
    `user5_inv` varchar(40) NOT NULL default '', 
    `user6_inv` varchar(40) NOT NULL default '', 
    `user7_inv` varchar(40) NOT NULL default '', 
    `user8_inv` varchar(40) NOT NULL default '', 
    `user9_inv` varchar(40) NOT NULL default '',  

    `user1_ready` enum('0','1') NOT NULL default '1', 
    `user2_ready` enum('0','1') NOT NULL default '1', 
    `user3_ready` enum('0','1') NOT NULL default '1', 
    `user4_ready` enum('0','1') NOT NULL default '1', 
    `user5_ready` enum('0','1') NOT NULL default '1', 
    `user6_ready` enum('0','1') NOT NULL default '1', 
    `user7_ready` enum('0','1') NOT NULL default '1', 
    `user8_ready` enum('0','1') NOT NULL default '1', 
    `user9_ready` enum('0','1') NOT NULL default '1',  

    PRIMARY KEY (`id`) 
) TYPE=MyISAM ; 

現在我不知道我的侷限性。有多達30個用戶可以一起玩,這將是一件很酷的事情,但我的桌子需要3倍的場地。 30 x user1_gun 30 x user1_inv和30 x user1_ready

這個數據庫將被大量使用,因爲所有用戶在訪問頁面時都需要數據庫中的所有信息,以列出所有其他用戶名等。所有用戶也可以在表中更改至少3個值。

我應該限制我的表爲9個用戶還是我可以爲100個用戶製作一個表?我不知道。我可以編寫一些代碼,但現在從未管理過大型的mysql數據庫和服務器。

編輯:好的。只是要清楚。我有一個用戶表,包含我用戶的各種信息,連接到用戶表的汽車表,連接到我的用戶表的武器表。 這不是我唯一的桌子,最多有9名玩家可以玩這款遊戲!該oc表需要有用戶名和槍的字段,每個用戶已選擇和用戶已表示他們準備好了..我不認爲我需要數據庫正常化...

+4

你在這裏正確的時間:你正在尋找一些嚴重的正常化。 :)(現在不能寫一篇文章,但我確定有人會寫。) – 2010-08-21 20:06:14

+4

而不是將所有用戶的數據存儲在同一個表中。創建一個新表格並鏈接到該表格,以便可以在遊戲中存儲無限數量的用戶。閱讀更多關於維基百科或者數據庫規範化的信息:http://en.wikipedia.org/wiki/Database_normalization – Wolph 2010-08-21 20:07:44

+0

這款遊戲的實時性如何? MySQL在這裏可能不是你最好的選擇。 – NullUserException 2010-08-21 20:13:11

回答

7

你真的需要normalize你的數據庫!您使用的是關係數據庫,因此您應該做的第一件事是定義數據中的關係。

遊戲和玩家之間有一對多的關係(一個遊戲可以有很多玩家,但玩家一次只能玩一個遊戲)。因此,您應該創建一個遊戲桌,其中包含與每個遊戲(ID,領導者,汽車,車型,座位,份額,位置)相關的信息。然後創建一個單獨的用戶表,其中包含特定於用戶的所有數據(ID,名稱,槍,庫存,就緒)。然後,您可以使用foreign keys將用戶錶鏈接到遊戲表。因此,除了已經提到的用戶信息之外,用戶表還應該包含諸如game_id之類的字段,其將來自遊戲桌的遊戲的ID存儲爲外鍵。

則很可能通過包括槍表,汽車表等

正常化減少冗餘數據,提高數據庫的效率,並降低數據異常做進一步正常化。下面是對這個概念的一個很好的介紹:http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html這也可以通過連接表來完成,在查詢規範化數據庫時需要做這些工作。

編輯: 作爲對您的澄清的迴應,您可能希望查看數據庫以外的解決方案。你真的不應該在關係數據庫中有這樣的表。根據您提供的信息,似乎所有這些都在跟蹤遊戲中的信息,並且可能比關係數據庫有更好的解決方案。

如果您確實想將這些信息保存在關係數據庫中,則應該將其歸一化。所以,如果你已經有一個單獨的用戶表,你需要擴展它來考慮遊戲中的用戶信息,或者可能有一個active_users表,其中包含特定於當前遊戲的信息。

1

爲什麼不去兩列數據庫:基本上是一個關鍵的值得分。由於它是一款在線遊戲,因此可以很容易地使用memcache來快速訪問數據。

這兩列將是關鍵值 值將是數據的json表示。

+0

不太理解我將如何將當前數據庫中的值分隔爲兩列db – ganjan 2010-08-21 22:21:17