2012-12-28 94 views
1

我有一个在线服务(在线词汇培训师)。每个用户都有自己的词汇。大型数据库

现在,我不知道,我应该如何构建我的Mysql-DB。

据我所知,我有不同的可能性:

  1. 一切都在一个表(MyISAM数据):我店所有的词汇在一个大的MyISAM表,并添加一列“用户id”,以确定每个用户的词汇表

  2. 每个用户都有自己的表(MyISAM):每次创建用户时,程序会添加一个名为“vocabulary_ {userid}”的表,其中{userid}用于将表连接到一个用户。

  3. 在一张表(InnoDB)中的所有内容:像第一点一样,但用InnoDB代替MyISAM。

问题是,一个大的词汇表最多可以达到1亿行。使用MyISAM,问题是每个查询都会锁定整个表。所以我想,如果有很多用户在线(并发送很多查询),表格可能会被锁定很多。对于InnoDB,我不确定,因为我有很多SELECT-,UPDATE-和INSERT-命令,所以这是一个很好的解决方案。

我希望任何人都可以帮助我。先谢谢你。

+7

我想不出比#2更糟糕的选择。 – JJJ

+2

我质疑关系数据库是否适合这个问题,而不是我是这个问题的专家。 – jpmc26

+2

我想不出比Juhana更好的答复。 – GolezTrol

回答

3

InnoDB一起使用几乎总是更好。 InnoDB可以处理100个行,最大尺寸为64tb.

这听起来并不像你有关系数据集,而是更多的关键/值存储。也许Riak是一个更好的解决方案。

+0

如果使用关系数据库表,则必须使用适当的索引。 – jpmc26

1

这取决于

如果你开始有每个用户(又名切分)一个表,你将不得不在一开始一些麻烦。

如果您现在不需要缩放。去索引好的表格。我不会使用MyISAM但InnoDB的,而不是否则,你可以通过MyISAM数据的bigests问题被击中(锁...)

1

这个正常关系设计会,我想,用三个表:

  1. 用户 - 用户ID和其他属性:姓名,电子邮件等
  2. 词汇 - 对问题不太清楚,但可能包含词性和词义等属性,可能包含单词ID(因为某些单词拼写有多重含义)。
  3. User_Vocabulary - 包含用户ID,Word ID和可能属性的表格,如'学习日期'。

如果在进行查询时MyISAM锁定了表,那么如果需要对User_Vocabulary表进行并发更新,则无法使用MyISAM。所以,与InnoDB一起去所有的表。