网盘系统中目录结构数据的分库方案

  对于网盘系统,每个用户都有自己独立的文件目录,用户可以在自己的根目录下自由建立文件夹,上传文件。对于这样的树形目录结构,一般会建立成如下的表结构:

User表:

Userid

用户ID

Username

用户名

Rootid

根文件夹ID

Directory表:

Dirid

文件夹ID

Dirname

文件夹名

Parenteid

父文件夹ID

Document表:

Docid

文件ID

Docname

文件名

Parenteid

父文件夹ID

 

  为了应对未来数据的增长,需要对数据库进行分库,分库方式可以采用以下两种。

  第一种方式采用根据用户分库的方案,每个用户的文件信息都处于同一个库中,不同用户可能位于不同的库中。这种分库方式的优点是不需要修改数据库结构,只需要根据用户ID确定连接到哪个数据库实例,但是缺点也很明显,单个用户的文件信息还是不断增长的,为了限制其增长,往往需要限制单个用户的上传文件数量限制,这样就为以后的扩展带来麻烦,而且会为用户带来不好的用户体验。

  第二种方案需要修改数据库结构:

User表:

Userid

用户ID

Username

用户名

Rootid

根文件夹ID

dbnode

根文件夹所处的数据库实例

Directory表:

Dirid

文件夹ID

Dirname

文件夹名

Parenteid

父文件夹ID

dbnode

子文件夹和文件所处的数据库实例

Document表:

Docid

文件ID

Docname

文件名

Parenteid

父文件夹ID

 

  这种分库方案在用户和文件夹表中增加了一个dbnode列,表示其根文件夹或子一层数据所处的节点,因为对于层次结构数据来说大部分操作是针对某个节点下一层的数据,取子树的操作极少,因此这种分库方式将位于不同层的数据存放在不同的数据库节点,细化了数据的分布。当然单层的数据还是有可能持续增长,这时我们可以只限制某一层——相当于某一个文件夹下——的文件数量,而用户的总数据量就可以不受限制。这种分库方式的缺点就是需要修改表结构,而且每次查询时必须要取得数据库节点的id,跨数据源进行查询。优点就是更好的数据分布性。

posted on 2013-08-30 10:54  aurawing  阅读(1581)  评论(0编辑  收藏  举报