我正在编写一个应用程序,允许每个用户在三个类别中标记英语单词(一些词汇练习)。
主DB表Word包含大约4K个不同的单词行。Label表格包含3个标签。--> Word- label 表(包含3列: word_id、label_id、user_id)将为每个用户添加4K行(假设当用户注册到系统时,所有单词都以某个预定义的标签开头)。
问题是这个表将会增长得非常快。在我看来,1:4000 (用户/行)是不好的。
你能在这里提出什么建议来消除这么大的一张桌子?我读到过,每个用户的表也被认为是不好的做法。
此外,我使用的是Spring & Hibernate和用户首次注册后的4K插入,这是非常困难和耗时的。
我可以考虑一些NoSQL解决方案或Hibernate之外的其他工具,但我决定使用Java和-所以建议一些合适的工具。
会很高兴在这里得到你的帮助!
发布于 2018-06-04 06:26:50
数据大小没有问题。您可能对Hibernate有问题,但这是另一个问题。
如果您最终拥有数千个用户,那么您将拥有数千万行。这不是很大的行数。如果要为新用户插入默认标签,则代码应如下所示:
insert into userLabels (userId, wordId, label)
select :userId, w.wordId, <default label>
from words w;
如果这花费的时间超过一两秒,我会感到惊讶。
如果你知道你会有数百万的用户,那么规模可能是一个更大的问题。最佳解决方案需要对应用程序有更好的理解。解决方案可能会有所不同,包括对表进行分区、使用数组,或者采用不同的结构来表示数据。
您可能希望在表上使用不同的索引来提高性能,但这取决于要运行的查询。您可以考虑使用数据库的本机接口。您的用例看起来并不是特别复杂,所以我不知道Hibernate或类似的层给您带来了什么好处。
发布于 2018-06-04 05:56:29
第一种方法是,您只需在操作后将新行添加到user的word-label。因此,并不是每个用户都可能在该表中有4k行。现在,当您的数据库查询和围绕该功能的东西将是一个问题(瓶颈)时,请尝试解决该问题并提高性能。
在sql数据库中,您可以使用许多性能技巧。例如,您编写了关于每个用户的表。这不是最好的解决方案,下一个例子,在mysql中,你可以创建表部分,它将作为一个表来处理,但性能会有所提高。
第二种方法,对于这种类型的数据,像MongoDB这样的NoSQL当然会有很好的性能。
发布于 2018-06-04 06:12:40
您可以将用户响应映射编码为4000个条目的位数组,如果不需要数据库的关系功能,则可以将其编码为字符串
那么它将是每个用户一条记录。
create table user_words (userid int, wiorddata text);
insert into user_words values (1,'YNYYNmmmYY'/* ... */ );
你的应用程序需要有每个字符所引用的单词和kniow的列表。
https://stackoverflow.com/questions/50671264
复制相似问题