适用于多个用户的相当大(400k)的mysql数据库设计

时间:2016-01-13 13:21:19

标签: mysql database-design

我正在寻求有经验的管理员的建议。

我正在一个网站上工作,你在那里解决单词字谜。如果它解决了,就不应再显示了。

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?

3 个答案:

答案 0 :(得分:0)

您不会将用户设为列。如果我理解了这个问题,你就会有一个表格,称为WordUsers,每行一行#34;"和每个用户":

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)
);

当向用户显示单词时,则向该表添加一行。 . . .可以包含其他信息,例如交互的日期/时间。

答案 1 :(得分:0)

如果你的数据库支持它(我认为所有这些都支持它) - 为什么不在用户的表上放置一个文本字段,用“N”字符串填写“否” - 它们没有看到这个单词“并且当他们被给出一个单词时,只需将”N“更改为”Y“以获取该记录/单词并重新保存新字符串? TEXT字符串最长可达65,536个字符。所以你让你的字符串就像5,000“N”。

或者如果你想要打败自己 - 使用BIT字段并使它像5000标志。相同的概念,但更难使用。

顺便说一句:在“N”和“Y”的字符串上你应该能够创建一个类似“WHERE SUBSTR(SEEN_IT,WORD_ID,1)='N'”类似测试的SQL查询。

答案 2 :(得分:-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);