Java 每个用户向数据库插入约4K行-设计和维护;演出

Java 每个用户向数据库插入约4K行-设计和维护;演出,java,sql,database,postgresql,hibernate,Java,Sql,Database,Postgresql,Hibernate,我正在编写一个应用程序,允许每个用户将英语单词分为三类(一些词汇练习) 主DB表Word,包含约4K行不同的单词。 标签表包含3个标签。 -->Word Label表(包含3列:Word\u id、Label\u id、user\u id)将为每个用户添加4K行(假设当用户注册到系统时,所有单词都以某个预定义的标签开头) 问题是这个表将增长得非常快。1:4000(用户/行)在我看来是不好的 你有什么建议来消除这么大的桌子?我读过,每个用户的表也被认为是不好的做法 此外,我正在使用Spring和H

我正在编写一个应用程序,允许每个用户将英语单词分为三类(一些词汇练习)

主DB表Word,包含约4K行不同的单词。 标签表包含3个标签。 -->Word Label表(包含3列:Word\u id、Label\u id、user\u id)将为每个用户添加4K行(假设当用户注册到系统时,所有单词都以某个预定义的标签开头)

问题是这个表将增长得非常快。1:4000(用户/行)在我看来是不好的

你有什么建议来消除这么大的桌子?我读过,每个用户的表也被认为是不好的做法

此外,我正在使用Spring和Hibernate,用户第一次注册后的4K插入非常困难,需要时间

我可以考虑一些NoSQL解决方案或其他工具,而不是Hibernate,但是我是用<强> Spring和java < /St>>——所以适当地建议。< /P>


我会很高兴在这里得到你的帮助

第一种方法,您只需在操作后为用户将新行添加到word标签。因此,并非每个用户都可能在该表中有4k行。现在,当您的数据库查询和相关功能出现问题(瓶颈)时,请尝试解决该问题并提高性能

sql数据库中有许多性能技巧可以使用。例如,您编写了关于每个用户的表。这并不是最好的解决方案,下一个例子,在mysql中,您可以创建表分区,它将作为一个表处理,但性能有所提高


第二种方法,对于这种类型的数据,某些NoSQL(如MongoDB)的性能会很好。

第一种方法,您只需在操作后为用户的word标签添加新行即可。因此,并非每个用户都可能在该表中有4k行。现在,当您的数据库查询和相关功能出现问题(瓶颈)时,请尝试解决该问题并提高性能

sql数据库中有许多性能技巧可以使用。例如,您编写了关于每个用户的表。这并不是最好的解决方案,下一个例子,在mysql中,您可以创建表分区,它将作为一个表处理,但性能有所提高


第二种方法,对于这种类型的数据,某些NoSQL(如MongoDB)的性能会很好。

如果不需要数据库的关系功能,可以将用户响应映射编码为4000个条目位的数组或字符串

那么每个用户将有一条记录

create table user_words (userid int, wiorddata text);
insert into user_words values (1,'YNYYNmmmYY'/* ... */ );

您的应用程序需要有每个字符所指的单词和字母的列表。

如果不需要数据库的关系功能,您可以将用户响应映射编码为4000个条目位的数组或字符串

那么每个用户将有一条记录

create table user_words (userid int, wiorddata text);
insert into user_words values (1,'YNYYNmmmYY'/* ... */ );

您的应用程序需要有每个字符所指的单词和单词的列表。

数据大小没有问题。Hibernate可能有问题,但那是另一个问题

如果您最终拥有数千个用户,那么您将拥有数千万行。这不是很多行。如果要为新用户插入默认标签,则代码如下所示:

insert into userLabels (userId, wordId, label)
    select :userId, w.wordId, <default label>
    from words w;
插入用户标签(userId、wordId、label)
选择:userId,w.wordId,
从单词w;
如果这需要一两秒钟以上的时间,我会感到惊讶

如果您知道您将拥有数百万用户,那么大小可能是一个更大的问题。最好的解决方案需要更好地理解应用程序。解决方案可能因表分区、使用数组或提出不同的数据表示结构而有所不同


您可能希望在表上使用各种索引来提高性能,但这取决于您希望运行的查询。您可以考虑使用本机接口到数据库。您的用例似乎并不特别复杂,所以我不知道Hibernate或类似的层给您带来了什么好处。

数据大小没有问题。Hibernate可能有问题,但那是另一个问题

如果您最终拥有数千个用户,那么您将拥有数千万行。这不是很多行。如果要为新用户插入默认标签,则代码如下所示:

insert into userLabels (userId, wordId, label)
    select :userId, w.wordId, <default label>
    from words w;
插入用户标签(userId、wordId、label)
选择:userId,w.wordId,
从单词w;
如果这需要一两秒钟以上的时间,我会感到惊讶

如果您知道您将拥有数百万用户,那么大小可能是一个更大的问题。最好的解决方案需要更好地理解应用程序。解决方案可能因表分区、使用数组或提出不同的数据表示结构而有所不同


您可能希望在表上使用各种索引来提高性能,但这取决于您希望运行的查询。您可以考虑使用本机接口到数据库。您的用例似乎并不特别复杂,所以我不知道Hibernate或类似层有什么优势。

谢谢您的想法!问题是,即使我在用户操作后添加,每个用户都可以达到4K行……感谢您的想法!问题是,即使我在用户操作后添加,每个用户可以达到4K行……您希望有多少用户?单词或标签是否动态(是否会随着时间的推移添加新的)?我猜这不是一个真正的问题。每个用户4k行不是什么大问题。用户数量没有限制。现在是1K-5K。标签是静态的(三个,每个都有一个唯一的id)。文字也是静态的(我可以添加超过4K)。如果每个用户4K行不是什么大问题,为什么要花1-2分钟才能将它们插入tabl