2016-01-13 97 views
0

我正在尋求有經驗的管理員的意見。相當大(400k)mysql數據庫設計爲多個用戶

我正在一個網站上工作,在這裏你解決單詞anagrams。如果它解決了,它不應該再次顯示。

Wordbase包含〜400k條目。什麼是存儲這些數據的最有效的解決方案?

的一種方法是:

+---------+------------------------+ 
| word_id | user1 | user2 | user...| 
+---------+------------------------+ 
| 1  | null | null | 1  | 
| 2  | 1  | null | null | 
| ... |  |  |  | 
| 400000 | null | 1 | null | 
+---------+------------------------+ 

如果假設1 =解決。

但是它不會很快成爲怪物嗎? (+即使是一個簡單的查詢,由一個新用戶擴展它永遠)

其他解決方案是爲所有用戶存儲每個解決word_id,但它可以爲每個條目6位數,並大規模和迅速增長以及。

哪個引擎在這個例子中更有效? MyISAM或InnoDB?

+2

不是真的增添了這一點,但仍然註釋。 400k記錄甚至不是很接近被遠程相當大 – ChrisBint

+0

@ChrisBint Mysql新手的詞彙,對不起:) –

回答

0

您不會將用戶設置爲列。如果我理解這個問題,你將有一個表,稱爲像WordUsers每「字」,一個每個「用戶」一行:

create table WordUsers (
    WordUserId int not null primary key auto_increment, 
    WordId int not null, 
    UserId int not null, 
    . . . 
    constraint fk_WordId foreign key (WordId) references Words(WordId), 
    constraint fk_UserId foreign key (UserId) references Users(UserId) 
); 

當一個字被顯示給用戶,那麼你添加排到這張桌子。 . . .可以包含其他信息,例如交互的日期/時間。

+0

是的,我認爲把用戶作爲列是一個很大的禁忌,所以謝謝你澄清 –

+0

'WordUserId int not null primary key auto_increment'是一種浪費;只需要'PRIMARY KEY(WordId,UserId)'。 –

0

如果你的數據庫支持它(我認爲他們現在都在做) - 爲什麼不把一個文本字段放在用戶的表上,用一串「N」填充爲「否 - 他們沒有」 t看到這個單詞了「,當他們被給出一個單詞時,只需將該記錄/單詞的」N「更改爲」Y「並重新保存新的字符串?一個TEXT字符串最長可達65,536個字符。所以你讓你的字符串像5000「N」一樣。

或者如果你想打敗自己一點 - 使用BIT字段,並使其像5000標誌。相同的概念,但更難使用。

順便說一句:在「N」和「Y」的字符串上,你應該可以做一個類似於「WHERE SUBSTR(SEEN_IT,WORD_ID,1)='N''類似測試的SQL查詢。

+1

'TINYTEXT'限於256字節_。 –

+0

@RickJames:你說得對!我應該說使用TEXT而不是TINYTEXT。相應地修改答案。 –

+0

仍然不完全正確 - _bytes_,而不是_characters_。對於utf8,這可能是差異的3倍。 –

-1

您應該使用關係數據庫中,像它應該是關係:

CREATE TABLE user(user_id int autoincrement, user CHAR(16)); 
CREATE TABLE word(word_id int autoincrement, word CHAR(16)); 
CREATE TABLE solved(word_id, user_id); 
+0

你能提供一些比「沒有任何東西就叫做*關係*數據庫」更重要的推理嗎? –