2013-01-23 44 views
0

所以據我所知在mysql中沒有集合,列表,字典或數組。我想建立一個有兩個核心組件的系統,一個遊戲比賽的信息,然後是比賽中的角色列表。如果有在MySQL中列出,那麼我會做這樣的事情:在mysql中正確地組織數據

game_id INT, 
characters list<varchar>, 
....more data 

,我希望能夠做的基本的查詢是這樣的:

SELECT * FROM games WHERE characters IN LIST(list); 

它可能我可以選擇只有一個字符,或者我可以指定10個字符。問題是如何在mysql中有效地執行此操作,與使用OR中的10 WHERE子句相比。也沒有特定的字符排序......但我想我可以根據他們的ID來訂購它們。

我認爲這樣做的唯一方法就是創建第一張帶有基本信息的表格,第二張帶有字符id和game_id的表格。

任何人都有關於如何很好地組織這些數據的建議,我可能不知道一些奇特的mysql技巧?查詢也需要很快,因爲最終可能會有很多查詢。除非我添加一個查看/下載計數器,否則它會比寫入方式多讀取數據......比我猜想寫入/更新會比讀取更多。

謝謝,我很樂意提供任何信息。

+0

你已經接近回答你自己的問題了:「我認爲這樣做的唯一方法是創建第一張帶有基本信息的表格,第二張帶有字符id和game_id的表格。」這聽起來像是一種SQLish的做事方式。既然你想使用MySQL,你的解決方案就必須是這樣的。 List概念本身不起作用,因爲正如你所說的那樣,這不僅僅是SQL如何操作。 @neokio也提供了一些可能有所幫助的具體想法。 – DWright

+0

@Dright您會建議哪些其他系統?你聽起來好像有更好的系統可以創建這個查詢。我知道一些NoSQL,但據我所知,這對我來說沒有多大用處,因爲WHERE條件可能不是恆定的,可能是一堆過濾器...... – MasterGberry

+0

不太瞭解NOSQL - 我的觀點是,要在SQL中這樣做,你需要以一種適合SQL的方式來完成 - 通過多個表進行合理的建模一個有用的方法,(超出使用IN())。你提到的兩個存儲和關聯遊戲ID和字符ID的表比列表本身的概念更有前途,因爲它聽起來更像SQL。我沒有很好地闡述我的直覺。 。 。但是,當您談論多個表時,您似乎已經擁有了正確的SQL語言 - 這些可以加入,並且都是關於SQL中的連接! – DWright

回答

2

兩種方式我能想到的,如果我正確地理解你的問題....

方法1 ...添加game_characters表看起來像......

CREATE TABLE `games_characters` (
    `game_id` int(11) DEFAULT NULL, 
    `character_id` int(11) DEFAULT NULL, 
    KEY `games` (`game_id`), 
    KEY `characters` (`character_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

。 ..然後查詢會是這樣的......

SELECT * 
FROM `games` as g 
LEFT JOIN `games_characters` as gc 
    ON (g.`id` = gc.`game_id`) 
WHERE gc.`character_id` IN (12,52,86,23) 

方法2 ...使用LIKE,對於大型數據庫不太理想,但是避免使用額外的表...... characters記錄將包含來自另一個表characters的許多ID,這些表由諸如「.23.51.252.75.93」之類的句點分隔。該查詢看起來像

SELECT * 
FROM `games` 
WHERE `characters` LIKE '%.23.%' 
    OR `characters` LIKE '%.58.%' 

您的內容管理系統將不得不分析和重建字符串。

+0

第一個查詢的性能如何?那麼至少可以說20-30ms或更低?當遊戲字符中有1000萬行(每個說100萬個遊戲)時,MYSQL會如何擴展? – MasterGberry

+0

在你的例子中有沒有比較'game_id'和'chracter_id'的'KEY'系統? – MasterGberry

+0

對於1000萬行,方法1將具有優越的性能,並且對於那個簡單的查詢,我會猜測15-30ms。你一定會想要包括一個索引...我會更新現在上面的創建表 – neokio