最近在做接触一个海量数据存储与搜索的项目.应用和CSDN的论坛相似.以下我用实例+场景说明吧.这样直观些.
我是如下设计数据库.
1.数据库采用mysql或SqlServer主贴表如下
create table Posts
(
  id      VARCHAR2(18) not null,
  author      VARCHAR2(40),     --作者
  posttime   datetime,          --提交时间
  contents    VARCHAR2(4000),   --发贴内容
  modifytime datetime,          --修改时间
  status    int
)
在posttime,contents,author,id这些个字段上建立索引
跟贴回复表如下:
create table Replies
(
  id      VARCHAR2(18) not null,
  postid      VARCHAR2(18),     --主贴id
  author      VARCHAR2(40),     --作者
  posttime   datetime,          --提交时间
  contents    VARCHAR2(4000),   --发贴内容
  modifytime datetime,          --修改时间
  orders    int,                --楼层
  status    int
)
在postid,posttime,contents,author,id这些个字段上建立索引
问题1.我是把主贴表和回复表分开设计,这样设计是否合理.有朋友说可以把这二张表合二为一.
但是我考虑数据量以后会很大.日积月累.以后每天至少会有产生3000个贴子至少.问题2.这二张表的contents字段都是存储大量文本.和CSDN发贴填的内容一样.有可能还是rich文本内容.
.这里是用text存储还是以varchar2来存储?而且是不是要进行索引问题3.索引我这样建是否合理?有朋友说要索引太多.反而会影响性能.
问题4.搜索.这个是个头痛的问题.搜索的场景和使用CSDN根据内容搜索贴子是一样的..而且不能加时间
来限制贴子内容.如一个用户输入"海量数据存储",则要将这二张表中的contents字段中有这个相似词的贴子
或回复内容全部检索出来.分页显示.

解决方案 »

  1.   

    合理。分开。MYSQL不存在VARCHAR2的区别,但VARCHAR是有最大限制的。所以用TEXT
    要看你的SELECT语句是什么,才能知道你的索引应该是什么。 这个没办法,是全表扫描。 或者你可以添加全文索引。
      

  2.   

    2 mysql要用text类型才能放4000以上,建不了索引
    mssql倒是可以用varchar,不过varchar800以上也建不了索引3 索引一定要和where相关,具体看where语句。
    另外 表1中用户名,建议使用用户的ID
      

  3.   

    1 分开设计
    2 text
    3 不多
    4 用第三方搜索引擎
      

  4.   

    谢谢楼上的回复
    CSDN这二天好像有问题。老是报服务器无法响应。。我想整站做成动态+静态这样子。。
    数据还是存储在mysql表中。。但是将mysql中的贴子和回复生成一个静态的html.以文件存储在服务器上
    如果用户要搜索贴子。不是直接搜索mysql中的表。而是通过第三方的搜索引擎,如google或baidu这样子的。好像能搜索文件。。通过这种方法来搜索贴子。。减少全表扫描。。
    但现在有一个问题。何时生成静态的html?这肯定要后台run一个程序。在不停的根据贴子生成静态的html。。
    如果有更新贴子。势必也要重新生成html..有点纠结。。
    请有经验的朋友聊聊
      

  5.   

    1) 分开。从你的描述来看,没有任何理由听信你朋友的观点
    2) 所谓的rich文本内容的话,是否是指带有标记的文本(比如<b>或者『b』),是的话,就是text,如果是包含二进制内容,blob
    3) 索引如何建,ls诸位已经说了,看你查什么。索引影响效率的问题,那要看读写比。另外,可以考虑把最常用的字段组合放在一张表。比如,用户信息,“极端情况下”甚至可以单独把id和name放一张表,其余字段和id放另外的表。
    4) 如果可能的话,建议改变设计。提交文章话,可以手工添加标记(tags),搜索的时候优先搜标记。如果找不到相关标记,或者找出的内容用户不满意,再考虑让用户手工进行全表扫描的全文搜索。
    比如,搜索mysql,tags表里面有200篇文章。先(分页)显示这200文章,同时在旁边有一个按钮,用户可以选择进行全文搜索,此时对Posts表进行扫描。