2010-04-06 42 views
1

环境:JBoss和MySQL和JPA,Hibernate的存档策略和数据的限制,在一个表中

我们的Web应用程序将迎合大量用户的(〜1,000,000)并且有很多的子表,其中的存储用户特定的数据(例如个人,健康,论坛贡献...)。

  1. 什么是归档用户&用户特定信息的最佳实践。 [a]将归档用户的特定信息移动到同一数据库中的相应表(例如user_archive,user_forum_comments_archive ...)或将 [b]标记为数据库条目是否明智原始表格并仅查询未归档的条目。

  2. 我们对User.loginid有一个唯一的约束,如果用户通过1- [a]归档(即如果具有loginid'samuel的用户'被移入归档表中并且if一个新的用户在原始表中添加了相同的名称,你将如何防止这个问题:解决唯一密钥约束的最佳策略是什么

  3. 我们有选择性地存档记录并将其带回的要求如果有必要,你会依赖数据库工具吗?你会通过JPA实体模型公开的持久性API来处理这个问题吗?

+0

首先,您希望能够对归档数据执行哪些操作?除了第二点和第三点之外,比如说,我在论坛中创建了几个条目,然后我停止提供并进行“归档”。我的贡献在活跃用户所做的贡献中仍然可见,还是会被归档?如果是的话,有人可以通过论坛访问哪些数据(即我的公开个人资料仍然可见)?你有什么样的政策让人们“再次活跃”?你期望有多少百分比的活跃用户和不活跃用户? – 2010-04-06 06:33:38

+0

我想论坛贡献应该是可见的,因为论坛仍然有很多帖子(因为论坛评论特定于用户的存档,可能使得对话完全无用)。用户的公共配置文件不需要向其他用户发布存档。我可能想要归档那些在系统中不活跃的用户(大约占系统中用户总数的10%)。再次,我只是在寻找什么才是解决这个问题的正确方法的想法,我的意图是保持表的大小尽可能小,以便活动用户的查询速度更快。 – Sam 2010-04-06 07:28:36

+0

如果您计划拥有1,000,000名用户,我确定希望您为他们使用自动生成/身份数字PK,而不是像'samuel'这样的用户名。你压榨你的索引性能,将字符串拖到任何地方。 – 2010-04-06 11:50:54

回答

2

就我个人而言,我会寻求解决方案“[a]”。

在两个表集(当前和归档)上分离事物会使常规RDBMS概念难以管理(例如:论坛评论作者将是指向用户表的外键......但你不能让一个字段作为两个不同表的外键)。 (用户表使用解决方案“a”,所有其他表像配置文件归档到一个双表,如每个解决方案“b”),但这会使事情变得不必要地复杂有些情况下,您必须查看非归档文件,有些情况下只归档,另外一些情况下则归入两者的联合)。

解决方案A也很容易解决#2和#3的要求。如果所有内容都在同一个表中,则用户名的唯一性很容易实施,而复活归档用户只是在主用户表上翻转一点(归档= Y/N)。

10%并不多,我怀疑在性能方面的差异会真正证明额外的复杂性(和bug的风险)。

+0

您是否建议您使用1- [b]而不是1- [a]来避免并发症? – Sam 2010-04-06 09:43:02

+0

是的。在归档标志上添加一个索引,以便SQL优化器可以快速修剪归档用户(当你不需要它们时),并且你应该没问题。 – 2010-04-06 11:29:37

1

我会在表格上放置一个归档标志,然后创建一个视图以便在不想查看归档记录时使用。这样,人们在应用我怀疑的归档标志时会更加一致。